Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 对象数组上的mongodb聚合_Node.js_Mongodb_Mongoose - Fatal编程技术网

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回答这个问题,这对你提高知识有很大帮助