web-dev-qa-db-fra.com

Tableau de correspondance de recherche d'agrégation MongoDB

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

10
Julian v.d Berkmortel

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"
  }}
])
17
Sagar Veeram