为了账号安全,请及时绑定邮箱和手机立即绑定

使用聚合管道在 MongoDB 中将功能从一个集合添加到另一个集合

使用聚合管道在 MongoDB 中将功能从一个集合添加到另一个集合

LEATH 2022-08-18 10:55:18
我有两个系列,它们与另一个相关。一个用户只能位于一个组中,而一个组可以包含多个用户。usersgroupsDocument A in users{  _id: 1234,  name: "John Doe"}Document B in users{  _id: 2345,  name: "Jane Roe"}Document G in groups{  _id: 3456,  name: "A Group",  members: [ObjectId("1234"), ObjectId("2345")]}现在,我想使用集合上的聚合管道将字段添加到每个用户以进行进一步处理。添加的字段应包含用户所属组的 ID。users_groupResult for Document A{  _id: 1234,  name: "John Doe",  _group: ObjectId("3456")}Result for Document B{  _id: 2345,  name: "Jane Roe",  _group: ObjectId("3456")}我真的不知道从哪里开始,以及如何以我描述的方式将这两个系列结合起来。
查看完整描述

1 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

这应该可以解决问题(https://mongoplayground.net/p/Iu53HQbi7Me):


测试数据:


// users collection

[

    {

      _id: ObjectId("5a934e000102030405000001"),

      name: "John Doe"

    },

    {

      _id: ObjectId("5a934e000102030405000002"),

      name: "Jane Roe"

    }

]


// groups collection

[

    {

      _id: 100,

      name: "A Group",

      members: [

        ObjectId("5a934e000102030405000001"),

        ObjectId("5a934e000102030405000002")

      ]

    }

]

查询:


db.users.aggregate([

// join the two collections

  {

    $lookup: {

      "from": "groups",

      "localField": "_id",

      "foreignField": "members",

      "as": "membersInfo"

    }

  },

// unwind the membersInfo array

  {

    $unwind: "$membersInfo"

  },

  {

    $project: {

      "_id": {

        $cond: {

          "if": {

            $in: [

              "$_id",

              "$membersInfo.members" // replace _id field based on the members

            ]

          },

          "then": "$_id",

          "else": "No group"

        }

      },

      "name": 1, // mantain this field

      "_group": "$membersInfo._id" // create _group field using the _id of groups collection

    }

  }

])

结果:


[

  {

    "_group": 100,

    "_id": ObjectId("5a934e000102030405000001"),

    "name": "John Doe"

  },

  {

    "_group": 100,

    "_id": ObjectId("5a934e000102030405000002"),

    "name": "Jane Roe"

  }

]


查看完整回答
反对 回复 2022-08-18
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信