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.