MongoDb聚合框架可对内部数组的元素进行分组

时间:2019-10-10 23:25:36

标签: mongodb aggregation-framework

我正在使用MongoDB聚合框架来尝试转换每个文档:

{
  "all": [
    {
      "type": "A",
      "id": "1"
    },
    {
      "type": "A",
      "id": "1"
    },
    {
      "type": "B",
      "id": "2"
    },
    {
      "type": "A",
      "id": "3"
    }
  ]
}

对此:

{
  "unique_type_A": [ "3", "1" ]
}

(最终结果是n个具有unique_type_A字段的文档的集合)

计算包括在数组中返回类型A的所有实体的唯一类型。

我陷入了$group步骤,有人知道该怎么做吗?

1 个答案:

答案 0 :(得分:2)

要将此逻辑应用于每个文档,可以使用以下内容;

db.collection.aggregate([
  {
    $unwind: "$all"
  },
  {
    $match: {
      "all.type": "A"
    }
  },
  {
    $group: {
      _id: {
        "type": "$all.type",
        "oldId": "$_id"
      },
      unique_type_A: {
        $addToSet: "$all.id"
      }
    }
  },
  {
    $project: {
      _id: 0
    }
  }
])

我们首先使用$unwind的地方,以便能够过滤和使用all数组的每个成员。然后,我们只过滤non type:"A"个成员。 $group阶段与复杂的_id有所不同,我们利用_id结果中的$unwind,它返回原始文档,因此我们可以将每个原始文件的结果。使用$addToSetid数组中收集all,以仅保留唯一值,而且很糟糕!

这是每个文档的结果;

[
  {
    "unique_type_A": [
      "3",
      "1"
    ]
  },
  {
    "unique_type_A": [
      "4",
      "11",
      "5"
    ]
  }
]

Mongoplayground上交互式检查代码