#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