Node.js 对象数组上的mongodb聚合
我试图将我的参与者数组分组,这样,对于单个参与者,我应该在一个数组中获得该参与者下的所有会议Node.js 对象数组上的mongodb聚合,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我试图将我的参与者数组分组,这样,对于单个参与者,我应该在一个数组中获得该参与者下的所有会议 [ { "_id": "5fc73e7131e6a20f6c492178", "participants": [ { "_id": "5fc74bc5e7c54d0ea8f133ca",
[
{
"_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-to-match,因为参与者字段是一个数组。
我试过这个
const docs = await Meeting.aggregate([
{ $unwind: '$participants' },
{
$lookup: {
from: 'participants',
localField: 'participants',
foreignField: '_id',
as: 'participants'
}
},
{ $match },
{ $group: { _id: "$participants", meetings: { $push: "$$ROOT" } } },
]);
但这与我希望的预期结果不匹配。您可以展开以解构数组,并使用组来获得所需的输出
db.collection.aggregate([
{
"$unwind": "$participants"
},
{
$group: {
_id: "$participants._id",
participants: {
$first: "$participants"
},
meetings: {
"$addToSet": "$title"
}
}
}
])
工作答案对你有帮助吗?是的。非常感谢。你能给我提供一些我可以练习或学习的链接吗?因为每次我看mongodb文档都会迷路。mongodb文档非常完美。请先看一遍。如果您需要更多,请使用。然后请尝试用stakoverflow回答这个问题,这对你提高知识有很大帮助