Как присоединиться к более чем 2 коллекциям в mongodb? - PullRequest
1 голос
/ 09 июля 2020

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

Например:

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")

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

   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"
        }
      }
    ]);

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

1 Ответ

1 голос
/ 09 июля 2020

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

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

Пн go Площадка

...