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

Fonctionnement du paramètre arrayFilters dans MongoDB

Dans MongoDB, lorsque vous mettez à jour des documents contenant des tableaux, vous avez la possibilité d'utiliser les arrayFilters paramètre.

Les arrayFilters Le paramètre vous permet de spécifier un tableau de documents filtres qui déterminent les éléments du tableau à modifier.

Dans le document de mise à jour, utilisez le $[<identifier>] opérateur positionnel filtré, qui identifie les éléments du tableau qui correspondent à arrayFilters conditions de l'opération de mise à jour.

Syntaxe

La syntaxe ressemble à ceci :

{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }

Ainsi, par exemple, lorsqu'il est utilisé avec le updateMany() méthode, cela se passe comme ceci :

db.collection.updateMany(
   { <query conditions> },
   { <update operator>: { "<array>.$[<identifier>]" : value } },
   { arrayFilters: [ { <identifier>: <condition> } ] }
)

Exemple

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

{ "_id" : 1, "scores" : [ 1, 5, 17 ] }
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

Nous pourrions utiliser les arrayFilters paramètre pour mettre à jour uniquement les éléments du tableau qui ont une valeur supérieure à un certain montant.

Exemple :

db.players.updateMany(
   { scores: { $gte: 10 } },
   { $set: { "scores.$[e]" : 10 } },
   { arrayFilters: [ { "e": { $gte: 10 } } ] }
)

Résultat :

{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }

Le message nous indique que trois documents ont été mis en correspondance et modifiés.

Voici à quoi ressemblent les documents maintenant.

db.players.find()

Résultat :

{ "_id" : 1, "scores" : [ 1, 5, 10 ] }
{ "_id" : 2, "scores" : [ 8, 10, 10 ] }
{ "_id" : 3, "scores" : [ 10, 10, 8 ] }

Nous pouvons voir que toutes les valeurs qui étaient auparavant supérieures ou égales à 10 sont maintenant 10.

Dans ce cas, j'ai utilisé e comme <identifier> . Notez que le <identifier> doit commencer par une lettre minuscule et ne contenir que des caractères alphanumériques.