sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo realizar operaciones de consulta básicas en MongoDB

En este artículo, abordaremos cómo realizar operaciones de consulta básicas en MongoDB. Estamos produciendo datos a un ritmo sin precedentes ahora siguiendo la expansión global de Internet. Dado que requerirá que recopilemos/solicitemos los datos requeridos de la base de datos para realizar algún tipo de análisis, es de suma importancia que elijamos la herramienta adecuada para consultar los datos.

Aquí es donde entra MongoDB, específicamente. MongoDB es una base de datos no estructurada que, en forma de documentos, almacena datos. Además, MongoDB es muy eficaz en el manejo de enormes cantidades de datos y es la base de datos NoSQL más utilizada, ya que proporciona un lenguaje de consulta enriquecido y un acceso a datos fácil y versátil.

Crear una base de datos de muestra

Antes de comenzar, crearemos una base de datos de muestra con algunos datos de muestra para realizar todas las operaciones.

Crearemos una base de datos con el nombre myDB y creará una colección con el nombre pedidos . Para ello, el enunciado sería el siguiente.

> use myDB
> db.createCollection("orders")
>

MongoDB no usa filas ni columnas. Almacena los datos en un formato de documento. Una colección es un grupo de documentos.

Puede verificar todas las colecciones en una base de datos utilizando la siguiente declaración.

> use myDB
>show collections
orders
system.indexes
>

Insertemos algunos documentos usando la siguiente declaración.

> db.orders.insert([
	{
		Customer: "abc",
		Address:{"City":"Jaipur","Country":"India"},
		PaymentMode":"Card",
		Email:"[email protected]",
		OrderTotal: 1000.00,
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":10},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"journal","Price":"200.00","Qty":2},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]		
	},
	{
		Customer: "xyz",
		Address:{"City":"Delhi","Country":"India"},
		PaymentMode":"Cash",
		OrderTotal: 800.00,
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]		
	},
	{
		Customer: "ron",
		Address:{"City":"New York","Country":"USA"},
		PaymentMode":"Card",
		Email:"[email protected]",
		OrderTotal: 800.00,
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":00}
		]		
	}
])

Un documento es el equivalente de una fila RDBMS. No es necesario que tenga el mismo esquema en cada documento. Significa que un documento puede no tener ningún campo que no tenga ningún valor.

Consultar Documentos

método buscar()

Debe utilizar el método find() para consultar documentos de las colecciones de MongoDB. La siguiente declaración recuperará todos los documentos de la colección.

> db.orders.find()
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		Address:{"City":"Jaipur","Country":"India"},
		PaymentMode":"Card",
		Email:"[email protected]",
		OrderTotal: 1000.00,
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":10},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"journal","Price":"200.00","Qty":2},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]		
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		Address:{"City":"Delhi","Country":"India"},
		PaymentMode":"Cash",
		OrderTotal: 800.00,
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		Address:{"City":"New York","Country":"USA"},
		PaymentMode":"Card",
		Email:"[email protected]",
		OrderTotal: 600.00,
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":00}
		]
	}
>

Proyección

Si desea obtener solo los campos seleccionados, puede utilizar la proyección. La siguiente declaración obtendrá solo Cliente y Correo electrónico campo.

> db.orders.find( { }, { Customer: 1, Email: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		Email:"[email protected]"
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz"		
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		Email:"[email protected]"		
	}
>

Filtrar los documentos especificando una condición

Ahora aprenderemos cómo podemos obtener los documentos que coinciden con una condición específica. MongoDB proporciona muchos operadores de comparación para esto.

1. Operador $eq

El operador $eq verifica la igualdad del valor del campo con el valor especificado. Para obtener el pedido donde PaymentMode es 'Tarjeta' puede usar la siguiente declaración

>db.orders.find( { PaymentMode: { $eq: "Card" } } )

Esta consulta también se puede escribir como a continuación

>db.orders.find( { PaymentMode: "Card" } )

Una instrucción SQL similar sería la siguiente

SELECT * FROM orders WHERE PaymentMode="Card"

Ejemplo

>db.orders.find( { PaymentMode: "Card" }, { Customer: 1, PaymentMode: 1 } )
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		PaymentMode":"Card"				
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		PaymentMode":"Card"
	}
>

Operador $eq con documento incrustado

Es posible que haya notado que insertamos un documento incrustado Dirección en los Pedidos recopilación. Si desea obtener el pedido donde País es 'India', puede usar una notación de puntos como la siguiente declaración.

>db.Orders.find( { "Address.Country": { $eq: "India" } } )

Esta consulta también se puede escribir como a continuación

>db.Orders.find( { "Address.Country":"India" } )

Ejemplo

>db.Orders.find( { "Address.Country": { $eq: "India" } } , { Customer: 1, Address: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		Address:{"City":"Jaipur","Country":"India"}
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		Address:{"City":"Delhi","Country":"India"}
	}
>

Operador $eq con matriz

El operador $eq recuperará todos los documentos si la condición especificada es verdadera para cualquier elemento de una matriz. Tenemos un Artículos de pedido matriz en el documento. Si desea filtrar los documentos en los que también se ordenó 'papel', la declaración sería la siguiente.

>db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } )

Esta consulta también se puede escribir como a continuación

>db.Orders.find( { "OrderItems.ItemName": "paper"  } )

Ejemplo

>db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } , { Customer: 1, OrderItems: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":10},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"journal","Price":"200.00","Qty":2},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]		
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]
	}
>

2. $gt Operador

Puede usar el operador $gt para recuperar los documentos donde el valor de un campo es mayor que el valor especificado. La siguiente declaración obtendrá los documentos donde OrderTotal es mayor que 800.

>db.orders.find( { OrderTotal: { $gt: 800.00 } } )

Una instrucción SQL similar sería la siguiente

SELECT * FROM orders WHERE OrderTotal>800.00

Ejemplo

>db.Orders.find( { "OrderTotal": { $gt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		OrderTotal: 1000.00
	}
>

3. Operador $gte

Puede utilizar el operador $gte para recuperar los documentos en los que el valor de un campo es mayor o igual que el valor especificado. La siguiente declaración obtendrá los documentos donde OrderTotal es mayor o igual a 800.

>db.orders.find( { OrderTotal: { $gte: 800.00 } } )

Una instrucción SQL similar sería la siguiente

SELECT * FROM orders WHERE OrderTotal>=800.00

Ejemplo

>db.Orders.find( { "OrderTotal": { $gte: 800.00 } } , { Customer: 1, OrderTotal: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		OrderTotal: 1000.00
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		OrderTotal: 800.00
	}
>

4. $lt Operador

Puede usar el operador $lt para recuperar los documentos donde el valor de un campo es menor que el valor especificado. La siguiente declaración obtendrá los documentos donde OrderTotal es menos de 800.

>db.orders.find( { OrderTotal: { $lt: 800.00 } } )

Una instrucción SQL similar sería la siguiente

SELECT * FROM orders WHERE OrderTotal<800.00

Ejemplo

>db.Orders.find( { "OrderTotal": { $lt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		OrderTotal: 600.00
	}
>

4. Operador $lte

Puede usar el operador $lte para recuperar los documentos donde el valor de un campo es menor o igual que el valor especificado. La siguiente declaración obtendrá los documentos donde OrderTotal es menor o igual a 800.

>db.orders.find( { OrderTotal: { $lte: 800.00 } } )

Una instrucción SQL similar sería la siguiente

SELECT * FROM orders WHERE OrderTotal<=800.00

Ejemplo

>db.Orders.find( { "OrderTotal": { $lte: 800.00 } } , { Customer: 1, OrderTotal: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		OrderTotal: 800.00
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		OrderTotal: 600.00
	}
>

5. $ne Operador

Puede usar el operador $ne para recuperar los documentos donde el valor de un campo no es igual al valor especificado.

>db.orders.find( { PaymentMode: { $ne: "Card" } } )

Una instrucción SQL similar sería la siguiente

SELECT * FROM orders WHERE PaymentMode != "Card"

Ejemplo

>db.Orders.find( { "PaymentMode": { $ne: "Card" } } , { Customer: 1, PaymentMode: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		PaymentMode":"Cash"
	}
>

6. Operador $in

Puede usar el operador $in para recuperar los documentos donde el valor de un campo es igual a cualquier valor en la matriz especificada.

>db.orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } )

Ejemplo

>db.Orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } , { Customer: 1, OrderItems: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":10},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"journal","Price":"200.00","Qty":2},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]		
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]
	}
>

7. Operador $nin

Puede usar el operador $nin para recuperar los documentos donde el valor de un campo no es igual a ningún valor en la matriz especificada. También seleccionará los documentos donde el campo no existe.

>db.orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } )

Ejemplo

>db.Orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } , { Customer: 1, OrderItems: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":00}
		]
	}
>

Indización

Sabemos que la indexación es muy importante si estamos realizando las consultas en una base de datos grande. Sin indexación, la ejecución de una consulta puede ser costosa. Podemos agregar un índice ascendente simple en un solo campo usando la siguiente declaración.

>db.Orders.createIndex({"Customer":1})

MongoDB crea un índice único en el campo '_id' de forma predeterminada. Un índice único evitará la inserción de dos documentos con el mismo valor para ese campo. Si desea crear un índice único, la declaración sería la siguiente.

db.Orders.createIndex( { "OrderId": 1 }, { unique: true } )

Conclusión

Espero que hayas aprendido algo nuevo hoy. Si quieres aprender algunas cosas más sobre MongoDB, aquí hay un artículo interesante sobre MongoDB autohospedado. También te invito a probar cosas por tu cuenta y compartir tu experiencia en la sección de comentarios. Además, si tiene algún problema con alguna de las definiciones anteriores, no dude en preguntarme en los comentarios a continuación.