Как присоединиться к более чем 2 коллекциям в mongodb?

У меня есть 3 коллекции: группы, пользователи и участники. Коллекция групп содержит сведения о группах, коллекция пользователей содержит сведения о пользователях, а коллекция участников содержит ассоциации пользователей с группами.

Например:

Groups:

id                                      |   name 
ObjectId("5ee5e346fae4a21e28a81d91")    |   Housemates 
ObjectId("5ee5e346fae4a21e28a81d92")    |   Co-workers


Users:

id                                      |   name
ObjectId("5ee493b0989d0f271cdc41c1")    |   Joulie
ObjectId("5ee493b0989d0f271cdc41c3")    |   Newelle
ObjectId("5ee493b0989d0f271cdc41c5")    |   John
ObjectId("5ee493b0989d0f271cdc41c7")    |   Larry

Members:
group_id                                | user_id  
ObjectId("5ee5e346fae4a21e28a81d91")    | ObjectId("5ee493b0989d0f271cdc41c1")
ObjectId("5ee5e346fae4a21e28a81d91")    | ObjectId("5ee493b0989d0f271cdc41c3")
ObjectId("5ee5e346fae4a21e28a81d92")    | ObjectId("5ee493b0989d0f271cdc41c5")
ObjectId("5ee5e346fae4a21e28a81d92")    | ObjectId("5ee493b0989d0f271cdc41c7")

Я хочу присоединиться к этим трем коллекциям и получить информацию о пользователе для каждой группы с именем группы.

   Expected Output:
    [
        { "group_name":"Housemates", 
          "user_info": [
            {"name":"Joulie"},
            {"name":"Newelle"}
            ]
        },
        { "group_name":"Co-workers", 
          "user_info": [
            {"name":"John"},
            {"name":"Larry"}
            ]
        }
   ]

Я написал запрос, чтобы получить вывод, как указано выше, но он не работает:

db.members.aggregate([
      {
        $lookup : {
          from: 'users',
          localField: "user_id",
          foreignField: "_id",
          as: "user_info"
        }
      },{
        $lookup: {
            from: 'groups',
            localField: "group_id",
            foreignField: "_id",
            as: "group_info"
        }
      }
    ]);

Этот вопрос выглядит похоже, и я пробовал решение от него тоже, но он, кажется, не работает для меня. Я был бы очень признателен за любую помощь или руководство. Заранее спасибо!


person Abhishek    schedule 09.07.2020    source источник
comment
Пожалуйста, выложите свои схемы   -  person Mahan    schedule 09.07.2020


Ответы (1)


У вас есть правильная идея, нам просто нужно восстановить данные после поиска:

db.members.aggregate([
  {
    $lookup: {
      "from": "groups",
      "localField": "group_id",
      "foreignField": "_id",
      as: "groups"
    }
  },
  {
    $lookup: {
      "from": "users",
      "localField": "user_id",
      "foreignField": "_id",
      as: "users"
    }
  },
  {
    $unwind: "$groups"
  },
  {
    $unwind: "$users"
  },
  {
    $group: {
      _id: "$groups._id",
      group_name: {
        $first: "$groups.name"
      },
      user_info: {
        $addToSet: {
          name: "$users.name"
        }
      }
    }
  }
])

Игровая площадка Mongo

person Tom Slabbaert    schedule 09.07.2020