繁体   English   中英

mongodb 在对象数组上聚合

[英]mongodb aggregate on array of objects

我正在尝试将我的参与者阵列分组到这样一种方式,即对于单个参与者,我应该将该参与者下的所有会议放在一个阵列中。

[
    {
        "_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 的方法,但我将参与者作为一个由单个参与者(对象)组成的数组。 并且我无法根据参与者的 email 运行 $match 来匹配,因为参与者字段是一个数组。 我试过这个

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

但这与我想要的预期结果不符。

您可以展开解构数组并使用 group 来获得您想要的 output

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

工作蒙戈游乐场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM