如何在 mongo 中按单个字段进行分组?

问题描述 投票:0回答:1

两部分问题

  1. 我想按单个字段对记录进行分组。

  2. 然后检索用户信息

我想按 REF_NotifierID 字段进行分组。

这是数据。

[
{
  "_id": "66d90957373dd9d5c85d503c",
  "REF_NotifierID": "66d9070f373dd9d5c85d5034",
  "REF_UserID": "66c8fbb1a97fee2ae10a3d81",
},
{
  "_id": "66d90a33373dd9d5c85d5050",
  "REF_NotifierID": "66d90700373dd9d5c85d502e",
  "REF_UserID": "66c8fbb1a97fee2ae10a3d81",
},
{
  "_id": "66d9ca6be74061bbd0d1996a",
  "REF_NotifierID": "66d90700373dd9d5c85d502e",
  "REF_UserID":"66d9c3ddc1d6fcc235ccc92e",
}
]

第 1 部分

这是我尝试过的...没有用:-(

$group : {
  REF_NotifierID: {
    $first: "$REF_NotifierID",
    $users: "REF_UserID",
  }
}

这是我想要返回的唯一数据,并且采用这种结构:

{
  "notifiers": [
    {
      "REF_NotifierID": "66d9070f373dd9d5c85d5034",
      "users": [
        {
          "REF_UserID": "66c8fbb1a97fee2ae10a3d81"
        }
      ]
    },
    {
      "REF_NotifierID": "66d90700373dd9d5c85d502e",
      "users": [
        {
          "REF_UserID": "66c8fbb1a97fee2ae10a3d81"
        },
        {
          "REF_UserID": "66d9c3ddc1d6fcc235ccc92e"
        }
      ]
    }
  ]
}

感谢@cmgchesss! 此分组正确

  {
    "$group": {
      "_id": "$REF_NotifierID",
      "users": {
        "$addToSet": {
          "REF_UserID": "$REF_UserID"
        }
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "notifiers": {
        "$push": {
          "REF_NotifierID": "$_id",
          "users": "$users"
        }
      }
    }
  },
  {
    "$unset": "_id"
  }

第 2 部分

我想从分组结果中获取用户信息

我尝试过查找

    $lookup: {
      from: 'users',
      localField: 'REF_UserID',
      foreignField: '_id',
      as: 'testusers',
    },

这就是我得到的:

[
        {
            "notifiers": [
                {
                    "REF_NotifierID": "66d9070f373dd9d5c85d5034",
                    "users": [
                        {
                            "REF_UserID": "66c8fbb1a97fee2ae10a3d81"
                        }
                    ]
                },
                {
                    "REF_NotifierID": "66d90700373dd9d5c85d502e",
                    "users": [
                        {
                            "REF_UserID": "66c8fbb1a97fee2ae10a3d81"
                        },
                        {
                            "REF_UserID": "66d9c3ddc1d6fcc235ccc92e"
                        }
                    ]
                }
            ],
            "testusers": []
        }
    ]

我希望使用用户表中用户的名字、姓氏字段来扩充 REF_UserID。

例如:

{
"REF_UserID": "66d9c3ddc1d6fcc235ccc92e",
"firstName": "Fred",
"lastName" : "Jones",
}
mongodb grouping pipeline
1个回答
0
投票

您可以在查找阶段内使用

$documents
对数组中的每个元素执行对 users 集合的单独查找。

此管道中的步骤:

  • 按通知程序分组,将用户 ID 推送到对象数组中
  • 不带集合的查找,指定用户 id 数组作为初始文档
  • 针对用户集合的嵌入式查找,以从每个用户记录中检索所需的数据(请注意 REF_UserId 的重复,以简化稍后组合文档的过程)
  • 展开嵌入的查找结果,使其成为对象而不是数组
  • 用查找到的数据替换原始用户数组条目。
db.notifier.aggregate([
  {$group: {
      _id: "$REF_NotifierID",
      users: {$push: {REF_UserID: "$REF_UserID"}}
  }},
  {$lookup: {
      let: {docs: "$users"},
      as: "users",
      pipeline: [
        {$documents: "$$docs"},
        {$lookup: {
            from: "users",
            localField: "REF_UserID",
            foreignField: "_id",
            as: "userData",
            pipeline: [
              {$project: {
                  _id: 0,
                  firstname: 1,
                  lastname: 1,
                  REF_UserID: "$_id"
              }}
            ]
        }},
        {$unwind: "$userData"        },
        {$replaceRoot: {newRoot: "$userData"}}
      ]
  }}
])

示例:游乐场

© www.soinside.com 2019 - 2024. All rights reserved.