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

L'opérateur de requête $expr ne semble pas fonctionner avec la notation de point de tableau

Le $expr autorise l'utilisation des opérateurs d'expression d'agrégation uniquement . La notation par points que vous utilisez ne fonctionnera pas pour accéder à l'élément de tableau pour le champ "values" : [ 1 ] . Vous devez utiliser le $arrayElemAt opérateur, et cela fonctionne bien.

Votre code find({$expr: {$eq: ["$value1", "$value2"]}}) a fonctionné, car le $expr utilisé l'opérateur d'expression d'agrégation $eq , pas l'opérateur du langage de requête MongoDB (MQL) $eq . Notez que les deux opérateurs se ressemblent, mais l'utilisation et la syntaxe sont différentes.

Et, le code find({$expr: {$eq: ["$value1", "$values.0"]}}) n'a pas fonctionné - comme prévu. Dans l'opérateur d'agrégation le $values.0 , le 0 est interprété comme un nom de champ, et non comme un index d'un champ de tableau.

La notation par points fonctionne bien dans $expr aussi. Voici un exemple, avec un exemple de document :

{ "_id" : 1, "val" : { "0" : 99, "a" : 11 } }

Maintenant, en utilisant le $expr et notation par points :

db.test.find({ $expr: { $eq: [ "$val.0", 99 ]  } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ]  } } )

Les deux requêtes renvoient le document - la correspondance se produit avec le filtre utilisant le $expr et la notation par points. Mais, ceci n'est valable qu'avec les documents intégrés (ou sous-) pas avec des champs de tableau.

Dans la documentation, Opérateurs de pipeline d'agrégation dit :

expressions :