Lors de la recherche d'agrégation MongoDb, le let nécessite-t-il un formatage spécial?
J'essaye d'utiliser la recherche MongoDB $ avec les sous-requêtes non corrélées.
Utilisation de MongoDB 3.6.12 (le support a commencé le 3.6)https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#join-conditions-and-uncorrelated-sub-queries
L'étape de pipeline suivante fonctionne, mais si j'échange le premier "userB" avec le second, aucun résultat n'est renvoyé.
{
from: 'friendships',
let: { requestuser: ObjectId("5c0a9c37b2365a002367df79"), postuser: ObjectId("5c0820ea17a69b00231627be") },
pipeline: [
{
$match : {
$or : [ { "userA" : ObjectId("5c0820ea17a69b00231627be"), "userB" : ObjectId("5c0a9c37b2365a002367df79") // "userB" : '$$requestuser'
},
{
"userA" : ObjectId("5c0a9c37b2365a002367df79"),
"userB" : ObjectId("5c0820ea17a69b00231627be")
}
],
"accepted" : true
}
},
{
$project: {v: 'true'}
}
],
as: "match"}
Résultats avec ObjectId codé en dur:
"match" : [
{
"_id" : ObjectId("5d6171dd319401001fd326bf"),
"v" : "true"
}
]
Résultats utilisant la variable:
"match" : [
]
J'ai l'impression que les ObjectIds ont besoin d'un traitement spécial. Tous les exemples que j'ai pu trouver utilisent des variables simples comme des chaînes.
Pour vérifier que le '$$ requestUser' contenait une valeur, je l'ai testé sur la projection:
"match" : [
{
"_id" : ObjectId("5d6171dd319401001fd326bf"),
"v" : ObjectId("5c0a9c37b2365a002367df79")
}
]
Réponses
Lorsque vous utilisez un sous-queires co-liés, vous devez utiliser $exprpour passer une variable. Vous pouvez essayer quelque chose comme suivant.
{
$match: {
$expr: { $or: [
{
$and:[ { $eq: [ "userA", ObjectId("5c0820ea17a69b00231627be") ]
},
{
$eq: [ "userB", ObjectId("5c0a9c37b2365a002367df79") ] }, { $eq: [ "userB", "$$requestuser" ] } ] }, { $and:[
{
$eq: [ "userA", ObjectId("5c0a9c37b2365a002367df79") ] }, { $eq: [ "userB", ObjectId("5c0820ea17a69b00231627be") ]
}
]
}
]
},
"accepted": true,
}
}
J'ai créé un exemple de démo pour montrer comment $expr
fonctionne dans la lookup
: Exemple de démo pour une sous-requête non corrélée