使用mongodb聚合对具有不同字段类型的文档进行分组

o8x7eapl  于 2023-05-22  发布在  Go
关注(0)|答案(1)|浏览(204)

我尝试了很多东西,但我不是一个真正的MongoDB天才,老实说,我甚至不确定这是否真的可能。我有一些文档,其中的字段有时可以是字符串,有时可以是字符串数组,我想将这两种情况组合在一起。
示例数据:

{ "identifier" : "b553622e-b1c9-4030-8460-a7783214359b", "participants" : [ "p1" ] }
{ "identifier" : "919f77bc-adca-4cbc-ac38-9139552cdb5b", "participants" : [ "p2" ] }
{ "identifier" : [ "919f77bc-adca-4cbc-ac38-9139552cdb5b", "b553622e-b1c9-4030-8460-a7783214359b" ], "participants" : [ "p3" ] }

预期的结果将是这样的:

{ "_id" : [ "919f77bc-adca-4cbc-ac38-9139552cdb5b", "b553622e-b1c9-4030-8460-a7783214359b" ], "participants" : ["p1", "p2", "p3",] }

_id是一个列表并不是真的必要的,这里的主要目标是能够对所有具有匹配标识符的文档进行分组,考虑使用和不使用列表的情况。这可能吗谢谢!
我尝试了$group操作的一些变体,但无法达到我想要的效果。

ee7vknir

ee7vknir1#

将您的收藏分为两个案例:

  1. identifier为数组
  2. identifier不是数组
    对于1,使用$match$type来获取文档。$unwindidentifier字段。$unionWith情况2(与1相同的提取,只需使用$ne)。执行$group以获得所需的结果。
db.collection.aggregate([
  {
    $match: {
      $expr: {
        $eq: [
          "array",
          {
            "$type": "$identifier"
          }
        ]
      }
    }
  },
  {
    "$unwind": "$identifier"
  },
  {
    "$unionWith": {
      "coll": "collection",
      "pipeline": [
        {
          $match: {
            $expr: {
              $ne: [
                "array",
                {
                  "$type": "$identifier"
                }
              ]
            }
          }
        }
      ]
    }
  },
  {
    "$unwind": "$participants"
  },
  {
    $group: {
      _id: null,
      allId: {
        "$addToSet": "$identifier"
      },
      participants: {
        $addToSet: "$participants"
      }
    }
  },
  {
    $project: {
      _id: "$allId",
      participants: 1
    }
  }
])

Mongo Playground

相关问题