我正在尝试通过一个MongoDB聚合查询计算多个字段的不同值。
所以这是我的数据:
{
"car_type": "suv",
"color": "red",
"num_doors": 4
},
{
"car_type": "hatchback",
"color": "blue",
"num_doors": 4
},
{
"car_type": "wagon",
"color": "red",
"num_doors": 4
}
我想要每个字段的明确计数:
distinct_count_car_type=3
distinct_count_color=2
distinct_count_num_doors=1
我能够对多个字段进行分组,然后进行不同的计数,但它只能让我对第一个字段进行计数。不是所有的人。 而且这也是一大堆数据。
答案 0 :(得分:5)
运行以下聚合管道应该可以得到所需的结果:
db.collection.aggregate([
{
"$group": {
"_id": null,
"distinct_car_types": { "$addToSet": "$car_type" },
"distinct_colors": { "$addToSet": "$color" },
"distinct_num_doors": { "$addToSet": "$num_doors" }
}
},
{
"$project": {
"distinct_count_car_type": { "$size": "$distinct_car_types" },
"distinct_count_color": { "$size": "$distinct_colors" },
"distinct_count_num_doors": { "$size": "$distinct_num_doors" }
}
}
])
答案 1 :(得分:1)
你正在寻找...... $objectToArray
的力量!
db.foo.aggregate([
{$project: {x: {$objectToArray: "$$CURRENT"}}}
,{$unwind: "$x"}
,{$match: {"x.k": {$ne: "_id"}}}
,{$group: {_id: "$x.k", y: {$addToSet: "$x.v"}}}
,{$addFields: {size: {"$size":"$y"}} }
]);
这将产生:
{ "_id" : "num_doors", "y" : [ 4 ], "size" : 1 }
{ "_id" : "color", "y" : [ "blue", "red" ], "size" : 2 }
{
"_id" : "car_type",
"y" : [
"wagon",
"hatchback",
"suv"
],
"size" : 3
}
您可以根据需要$project
或$addFields
添加或排除一组唯一值或大小。