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

MongoDB $pull

Dans MongoDB, vous pouvez utiliser le $pull opérateur pour supprimer des valeurs d'un tableau.

Utilisez $pull en conjonction avec une méthode telle que update() pour mettre à jour le document spécifié avec la modification.

Exemple

Supposons que nous ayons une collection appelée products avec les documents suivants :

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }

Nous pouvons supprimer un élément du tableau dans le document 1 comme ceci :

db.products.update( 
  { _id: 1 }, 
  { $pull: { sizes: "XXL" } } 
)

Sortie :

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Ce message nous indique qu'un document correspond et qu'un autre (c'est-à-dire le même document) a été modifié.

Jetons un coup d'œil à la collection maintenant :

db.products.find()

Résultat :

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }

Nous pouvons voir que le tableau dans le document 1 a eu sa valeur XXL supprimé comme spécifié.

Supprimer plusieurs valeurs

Nous pouvons utiliser le $in opérateur pour spécifier plusieurs valeurs que nous voulons supprimer du tableau.

Exemple :

db.products.update( 
  { _id: 3 }, 
  { $pull: { sizes: { $in: ["XS", "XL"] } } } 
)

Sortie :

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Maintenant, vérifions à nouveau la collection :

db.products.find()

Résultat :

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }

Nous pouvons voir que les deux éléments spécifiés ont été supprimés du tableau dans le document 3.

Mettre à jour tous les documents

Vous pouvez ajouter multi: true ou utilisez le updateMany() méthode pour mettre à jour tous les documents qui correspondent aux critères.

Lorsque vous faites cela, supprimez tous les critères de sélection du premier document de requête (qui spécifie le ou les documents à mettre à jour). En d'autres termes, utilisez un document vide comme premier argument de update() (ou updateMany() ) méthode.

Exemple :

db.products.update( 
  { }, 
  { $pull: { sizes: "XL" } },
  { multi: true }
)

Sortie :

WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })

Dans ce cas, nous pouvons voir que trois documents correspondaient (car il y a trois documents dans la collection), mais seulement deux ont été modifiés (car seulement deux avaient la valeur XL dans les sizes tableau).

Et revérifiez la collection :

db.products.find()

Résultat :

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }

Nous pouvons voir que toutes les instances de XL ont été supprimés de tous les documents de la collection.

Tableau de documents

Si vous avez un tableau contenant des documents comme éléments, vous pouvez supprimer n'importe lequel de ces documents en spécifiant des critères qui correspondent aux données du document.

Supposons que nous ayons une collection appelée restaurants qui contient les documents suivants :

{
	"_id" : 1,
	"name" : "The Rat",
	"reviews" : [
		{
			"name" : "Stanley",
			"date" : "04 December, 2020",
			"ordered" : "Dinner",
			"rating" : 1
		},
		{
			"name" : "Tom",
			"date" : "04 October, 2020",
			"ordered" : "Lunch",
			"rating" : 2
		}
	]
}
{
	"_id" : 2,
	"name" : "Yum Palace",
	"reviews" : [
		{
			"name" : "Stacey",
			"date" : "08 December, 2020",
			"ordered" : "Lunch",
			"rating" : 3
		},
		{
			"name" : "Tom",
			"date" : "08 October, 2020",
			"ordered" : "Breakfast",
			"rating" : 4
		}
	]
}
{
	"_id" : 3,
	"name" : "Boardwalk Cafe",
	"reviews" : [
		{
			"name" : "Steve",
			"date" : "20 December, 2020",
			"ordered" : "Breakfast",
			"rating" : 5
		},
		{
			"name" : "Lisa",
			"date" : "25 October, 2020",
			"ordered" : "Dinner",
			"rating" : 5
		},
		{
			"name" : "Kim",
			"date" : "21 October, 2020",
			"ordered" : "Dinner",
			"rating" : 5
		}
	]
}

Dans ce cas, le champ appelé reviews contient un tableau de documents. Chaque document est un avis différent du restaurant en question.

Nous pourrions utiliser $pull pour supprimer les avis qui correspondent à certains critères.

Exemple :

db.restaurants.update(
  { },
  { $pull: { reviews: { rating: { $lt: 4 } } } },
  { multi: true }
)

Sortie :

WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })

Ce message nous indique que trois documents correspondaient aux critères de la requête (car nous avons sélectionné tous les documents) et que deux documents ont été modifiés (car deux correspondaient à notre $pull critères).

Vérifions à nouveau la collection pour voir l'effet :

db.restaurants.find().pretty()

Résultat :

{ "_id" : 1, "name" : "The Rat", "reviews" : [ ] }
{
	"_id" : 2,
	"name" : "Yum Palace",
	"reviews" : [
		{
			"name" : "Tom",
			"date" : "08 October, 2020",
			"ordered" : "Breakfast",
			"rating" : 4
		}
	]
}
{
	"_id" : 3,
	"name" : "Boardwalk Cafe",
	"reviews" : [
		{
			"name" : "Steve",
			"date" : "20 December, 2020",
			"ordered" : "Breakfast",
			"rating" : 5
		},
		{
			"name" : "Lisa",
			"date" : "25 October, 2020",
			"ordered" : "Dinner",
			"rating" : 5
		},
		{
			"name" : "Kim",
			"date" : "21 October, 2020",
			"ordered" : "Dinner",
			"rating" : 5
		}
	]
}

Nous pouvons voir que seuls les avis avec une note de 4 et plus restent. Tous les avis de moins de 4 ont été supprimés.