MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment effectuer des opérations de requête de base dans MongoDB

Dans cet article, nous expliquerons comment effectuer des opérations de requête de base dans MongoDB. Nous produisons des données à un rythme inégalé suite à la propagation mondiale d'Internet. Puisqu'il nous faudra collecter/demander les données requises à partir de la base de données pour effectuer une sorte d'analyse, il est de la plus haute importance que nous choisissions le bon outil pour interroger les données.

C'est là qu'intervient MongoDB, en particulier. MongoDB est une base de données non structurée qui, sous forme de documents, stocke des données. De plus, MongoDB est très efficace pour gérer d'énormes quantités de données et est la base de données NoSQL la plus couramment utilisée car elle fournit un langage de requête riche et un accès aux données polyvalent et facile.

Créer un exemple de base de données

Avant de commencer, nous allons créer un exemple de base de données avec des exemples de données pour effectuer toutes les opérations.

Nous allons créer une base de données avec le nom myDB et créera une collection avec le nom commandes . Pour cela, la déclaration serait la suivante.

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

MongoDB n'utilise pas les lignes et les colonnes. Il stocke les données dans un format de document. Une collection est un groupe de documents.

Vous pouvez vérifier toutes les collections d'une base de données en utilisant l'instruction suivante.

> use myDB
>show collections
orders
system.indexes
>

Insérons quelques documents en utilisant l'instruction suivante.

> 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 document est l'équivalent d'une ligne RDBMS. Il n'est pas nécessaire d'avoir le même schéma dans chaque document. Cela signifie qu'un document peut ne pas avoir de champ sans valeur.

Requête de documents

méthode find()

Vous devez utiliser la méthode find() pour interroger les documents des collections MongoDB. L'instruction suivante récupérera tous les documents de la collection.

> 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}
		]
	}
>

Projection

Si vous souhaitez récupérer uniquement les champs sélectionnés, vous pouvez utiliser la projection. La déclaration suivante récupérera uniquement Client et E-mail champ.

> 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]"		
	}
>

Filtrer les documents en spécifiant une condition

Nous allons maintenant apprendre comment récupérer les documents qui correspondent à une condition spécifiée. MongoDB fournit de nombreux opérateurs de comparaison pour cela.

1. Opérateur $eq

L'opérateur $eq vérifie l'égalité de la valeur du champ avec la valeur spécifiée. Pour récupérer la commande où PaymentMode est 'Carte', vous pouvez utiliser la déclaration suivante

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

Cette requête peut également être écrite comme ci-dessous

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

Une instruction SQL similaire serait la suivante

SELECT * FROM orders WHERE PaymentMode="Card"

Exemple

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

Opérateur $eq avec document intégré

Vous avez peut-être remarqué que nous avons inséré un document intégré Adresse dans les Commandes le recueil. Si vous souhaitez récupérer la commande où Pays est 'Inde', vous pouvez utiliser une notation par points comme la déclaration suivante.

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

Cette requête peut également être écrite comme ci-dessous

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

Exemple

>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"}
	}
>

Opérateur $eq avec tableau

L'opérateur $eq récupérera tous les documents si la condition spécifiée est vraie pour n'importe quel élément d'un tableau. Nous avons un OrderItems tableau dans le document. Si vous souhaitez filtrer les documents où le "papier" a également été commandé, la déclaration serait la suivante.

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

Cette requête peut également être écrite comme ci-dessous

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

Exemple

>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. Opérateur $gt

Vous pouvez utiliser l'opérateur $gt pour récupérer les documents où la valeur d'un champ est supérieure à la valeur spécifiée. L'instruction suivante récupérera les documents où OrderTotal est supérieur à 800.

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

Une instruction SQL similaire serait la suivante

SELECT * FROM orders WHERE OrderTotal>800.00

Exemple

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

3. Opérateur $gte

Vous pouvez utiliser l'opérateur $gte pour récupérer les documents dont la valeur d'un champ est supérieure ou égale à la valeur spécifiée. L'instruction suivante récupérera les documents où OrderTotal est supérieur ou égal à 800.

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

Une instruction SQL similaire serait la suivante

SELECT * FROM orders WHERE OrderTotal>=800.00

Exemple

>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 Opérateur

Vous pouvez utiliser l'opérateur $lt pour récupérer les documents où la valeur d'un champ est inférieure à la valeur spécifiée. L'instruction suivante récupérera les documents où OrderTotal est inférieur à 800.

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

Une instruction SQL similaire serait la suivante

SELECT * FROM orders WHERE OrderTotal<800.00

Exemple

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

4. Opérateur $lte

Vous pouvez utiliser l'opérateur $lte pour récupérer les documents où la valeur d'un champ est inférieure ou égale à la valeur spécifiée. L'instruction suivante récupérera les documents où OrderTotal est inférieur ou égal à 800.

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

Une instruction SQL similaire serait la suivante

SELECT * FROM orders WHERE OrderTotal<=800.00

Exemple

>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 Opérateur

Vous pouvez utiliser l'opérateur $ne pour récupérer les documents où la valeur d'un champ n'est pas égale à la valeur spécifiée.

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

Une instruction SQL similaire serait la suivante

SELECT * FROM orders WHERE PaymentMode != "Card"

Exemple

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

6. Opérateur $in

Vous pouvez utiliser l'opérateur $in pour récupérer les documents où la valeur d'un champ est égale à n'importe quelle valeur dans le tableau spécifié.

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

Exemple

>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. Opérateur $nin

Vous pouvez utiliser l'opérateur $nin pour récupérer les documents où la valeur d'un champ n'est égale à aucune valeur dans le tableau spécifié. Il sélectionnera également les documents où le champ n'existe pas.

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

Exemple

>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}
		]
	}
>

Indexation

Nous savons que l'indexation est très importante si nous effectuons les requêtes sur une grande base de données. Sans indexation, l'exécution d'une requête peut être coûteuse. Nous pouvons ajouter un index ascendant simple sur un seul champ en utilisant l'instruction suivante.

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

MongoDB crée un index unique sur le champ '_id' par défaut. Un index unique empêchera l'insertion de deux documents avec la même valeur pour ce champ. Si vous souhaitez créer un index unique, la déclaration serait la suivante.

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

Conclusion

J'espère que vous avez appris quelque chose de nouveau aujourd'hui. Si vous souhaitez en savoir plus sur MongoDB, voici un article intéressant sur MongoDB auto-hébergé. Je vous invite également à essayer des choses par vous-même et à partager votre expérience dans la section des commentaires. De plus, si vous rencontrez des problèmes avec l'une des définitions ci-dessus, n'hésitez pas à me demander dans les commentaires ci-dessous.