我正在使用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
步骤,有人知道该怎么做吗?
答案 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
,它返回原始文档,因此我们可以将每个原始文件的结果。使用$addToSet
从id
数组中收集all
,以仅保留唯一值,而且很糟糕!
这是每个文档的结果;
[
{
"unique_type_A": [
"3",
"1"
]
},
{
"unique_type_A": [
"4",
"11",
"5"
]
}
]
在Mongoplayground上交互式检查代码