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 :