Как присоединиться к коллекции внутри массива объектов в MongoDB

#node.js #mongodb #express #mongodb-query

#node.js #mongodb #экспресс #mongodb-запрос

Вопрос:

У меня есть такой документ в коллекции под названием уведомления

 [
   {
       _id: 4f6a686ad4821115c0b4a721,
       title: "title 1"
       comments: [
         {
           comment: 'test 1',
           client_id: '1664158590921',
           createdAt: 2020-09-22T20:00:00.000Z
         },
         {
           comment: 'test 2',
           client_id: '1664158590875',
           createdAt: 2020-09-22T20:00:00.000Z
         }
       ]
   }
]
  

У меня есть такой документ в коллекции под названием clients

 {
    _id: 5f6a651faf591a3c742016dd,
    client_id: '1664158590921',
    email: 'test1@gmail.com'
}
{
    _id: 5f6a651faf591a3c742016dd,
    client_id: '1664158590875',
    email: 'test2@gmail.com'
}
  

Я пытаюсь создать запрос mongodb, чтобы получить такой результат:

 [
    {
       _id: 4f6a686ad4821115c0b4a721,
       title: "title 1"
       comments: [
         {
             comment: 'test 1',
             client_id: {
                _id: 5f6a651faf591a3c742016dd,
                client_id: '1664158590921',
                email: 'test1@gmail.com'
             },
             createdAt: 2020-09-22T20:00:00.000Z
         },
         {
             comment: 'test 2',
             client_id: {
                _id: 5f6a651faf591a3c742016dd,
                client_id: '1664158590875',
                email: 'test2@gmail.com'
             },
             createdAt: 2020-09-22T20:00:00.000Z
         }
      ]
   }
]
  

Возможно ли это или нет?
Любые советы о том, как приблизиться к подобному результату, подобному этому, очень ценятся, спасибо

Ответ №1:

  1. Поскольку localField является массивом, сначала вам нужно $unwind его.(требуется для следующего этапа)
  2. используйте $lookup для сопоставления.
  3. Сгруппируйте их по _id и очистите вывод.

Решение должно быть примерно таким.

 db.notifications.aggregate([
   {
      "$unwind":"$comments"
   },
   {
      "$lookup":{
         "from":"clients",
         "localField":"comments.client_id",
         "foreignField":"client_id",
         "as":"client_id"
      }
   },
   {
      "$group":{
         "_id":"$_id",
         "title":{
            "$first":"$title"
         },
         "comments":{
            "$push":{
               "comment":"$comments.comment",
               "client_id":"$client_id",
               "createdAt":"$comments.createdAt"
            }
         }
      }
   }
]).pretty()