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

MongoDB :Utilisation de la correspondance avec les variables de document d'entrée

Cela signifie-t-il que si vous utilisez des variables d'entrée dans un $lookuppipeline, vous devez utiliser $expr

Oui correct, par défaut dans les filtres, c'est-à-dire ; dans la partie filtre de .find() ou en $match étape d'agrégation, vous ne pouvez pas utiliser un champ existant dans le document.

Si vous avez besoin d'utiliser la valeur du champ existant dans votre filtre de requête, vous devez utiliser le pipeline d'agrégation, donc pour utiliser le pipeline d'agrégation dans .find() ou en $match vous devez envelopper votre requête de filtre avec $expr. La même façon d'accéder aux variables locales a été créée en utilisant let de $lookup filtrer dans $match doit être enveloppé par $expr .

Considérons ci-dessous l'exemple :

Exemples de documents :

[
  {
    "key": 1,
    "value": 2
  },
  {
    "key": 2,
    "value": 4
  },
  {
    "key": 5,
    "value": 5
  }
]

Requête :

 db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })

    Or

 db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])

Tester : mongoplayground

Si vous voyez la requête ci-dessus, saisissez 1 &4 sont passés dans la requête, mais vous vérifiez ci-dessous la requête où vous essayez de faire correspondre la key champ ==value champ - ça ne marche pas :

db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])

Tester : mongoplayground

Ci-dessus, lorsque vous comparez deux champs existants, vous ne pouvez pas le faire car cela signifie que vous recherchez des documents avec key valeur du champ sous forme de chaîne "$value" . Donc, pour dire que ce n'est pas une chaîne, c'est en fait une référence à value champ, vous devez utiliser l'opérateur d'agrégation $eq plutôt que l'opérateur de requête $eq comme ci-dessous :

 db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])

Tester : mongoplayground