J'ai deux collections, une collection avec des utilisateurs et une collection avec des groupes. Dans groups
les documents ressemblent à ceci:
{
"_id": ObjectId("...")
"members": [ObjectId("..."), ObjectId("..."), ObjectId("...")]
}
Dans la collection users
, les documents ressemblent à ceci:
{
"_id": ObjectId("...")
"first_name": "...",
"last_name": "...",
"phone": "..."
}
Ce que je veux faire, c'est une agrégation dans la collection users
où j'ajoute un $lookup
étape vers le pipeline où je vais à l'intérieur de la collection groups
et récupère le groupe de l'utilisateur selon que _id
du document utilisateur se trouve dans le tableau members
du document de groupe.
J'ai ce qui suit mais je ne sais pas comment je procéderais.
db.users.aggregate([
{
"$match": { "_id": ObjectId("...") }
},
{
"$lookup": {
"from": "groups",
"let": {"_id": "$_id"},
"pipeline": [{"$match": ???}], <- match when $$_id is inside $members
"as": "group"
}
]);
Je sais que le cadre d'agrégation dans MongoDB ne fonctionne pas avec les tableaux et qu'il existe un $unwind
stage mais je ne sais pas vraiment comment je combinerais $unwind
et $match
pour obtenir le résultat souhaité.
Ce que je veux:
{
"_id": ObjectId("..."),
"group": ObjectId("..."),
(other fields here)
}
J'utilise la version 3.7.2 du serveur MongoDB
Vous pouvez essayer l'agrégation ci-dessous de deux manières en utilisant $lookup
et $lookup
pipeline.
$ recherche
db.users.aggregate([
{"$match":{"_id":ObjectId(..)}},
{"$lookup":{
"from":"groups",
"localField":"_id",
"foreignField":"members",
"as":"group"
}},
{"$unwind":"$group"},
{"$unwind":"$group.members"},
{"$match":{"group.members":ObjectId(..)}}
])
$ pipeline de recherche
db.users.aggregate([
{"$match":{"_id":ObjectId(..)}},
{"$lookup":{
"from":"groups",
"let":{"_id":"$_id"},
"pipeline":[
{"$match":{"$expr":{"$in":["$$_id","$members"]}}},
{"$unwind":"$members"},
{"$match":{"$expr":{"$eq":["$$_id","$members"]}}}
],
"as":"members"
}}
])