агрегат mongodb для массива объектов

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

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

 [
    {
        "_id": "5fc73e7131e6a20f6c492178",
        "participants": [
            {
                "_id": "5fc74bc5e7c54d0ea8f133ca",
                "rsvp": "Yes",
                "name": "Participant 1",
                "email": "participant1@gmail.com"
            },
            {
                "_id": "5fc74e1254b8d337b4ae36d2",
                "rsvp": "Not Answered",
                "name": "Participant 2",
                "email": "participant2@gmail.com"
            }
        ],
        "title": "Meeting 1",
        "startTime": "2020-11-01T18:30:00.000Z",
        "endTime": "2020-11-03T18:30:00.000Z"
    },
    {
        "_id": "5fc73f1cdfc45d3ca0c84654",
        "participants": [
            {
                "_id": "5fc74bc5e7c54d0ea8f133ca",
                "rsvp": "Yes",
                "name": "Participant 2",
                "email": "participant2@gmail.com"
            }
        ],
        "title": "Meeting 2",
        "startTime": "2020-11-01T18:30:00.000Z",
        "endTime": "2020-11-03T18:30:00.000Z"
    }
]
 

мой ожидаемый результат должен быть следующим

 [{
"participant": {
                "_id": "5fc74bc5e7c54d0ea8f133ca",
                "rsvp": "Yes",
                "name": "Participant 1",
                "email": "participant1@gmail.com"
},
meetings: [{meeting1, meeting2, ...and so on}]
},
{
"participant": {
                "_id": "5fc74bc5e7c54d0ea8f133ca",
                "rsvp": "Yes",
                "name": "Participant 2",
                "email": "participant2@gmail.com"
},
meetings: [{meeting2, meeting3, ...and so on}]
}
]
 

Я вроде как застрял на несколько часов, чтобы разобраться в этом. Я попробовал этот подход, используя $group и $unwind, но я получал участников в виде массива, состоящего из одного участника (объекта). и на этом я не смог запустить $match для сопоставления в соответствии с электронной почтой участника, потому что поле участников было массивом.
Я попробовал это

             const docs = await Meeting.aggregate([
                { $unwind: '$participants' },
                {
                    $lookup: {
                        from: 'participants',
                        localField: 'participants',
                        foreignField: '_id',
                        as: 'participants'
                    }
                },
                { $match },
                { $group: { _id: "$participants", meetings: { $push: "$ROOT" } } },
            ]);
 

но это не соответствует ожидаемому результату, которого я хочу.

Комментарии:

1. Помогает ли вам ответ?

2. Да. большое вам спасибо.

3. Не могли бы вы предоставить мне несколько ссылок, по которым я мог бы практиковать или изучать агрегат? потому что каждый раз, когда я смотрю на документы mongodb, я теряюсь.

4. Документация Mongodb идеальна. Пожалуйста, сначала просмотрите его. Если вам нужны дополнительные, используйте university.mongodb.com . Тогда, пожалуйста, попробуйте ответить на вопрос в stakoverflow, который очень поможет вам улучшить знания

Ответ №1:

Вы можете развернуть, чтобы деконструировать массив и использовать group для получения желаемого результата

 db.collection.aggregate([
  {
    "$unwind": "$participants"
  },
  {
    $group: {
      _id: "$participants._id",
      participants: {
        $first: "$participants"
      },
      meetings: {
        "$addToSet": "$title"
      }
    }
  }
])
 

Рабочая игровая площадка Mongo