使用mongodb聚合的多个字段的不同计数

Dec*_*ard 6 distinct mongodb mongodb-query aggregation-framework

我正在尝试通过一个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
}
Run Code Online (Sandbox Code Playgroud)

我想要每个字段的明确计数:

distinct_count_car_type=3
distinct_count_color=2
distinct_count_num_doors=1
Run Code Online (Sandbox Code Playgroud)

我能够对多个字段进行分组,然后进行一次明显的计数,但它只能让我对第一个字段进行计数.不是所有的人.而且这是一大堆数据.

chr*_*dam 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" }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)


Buz*_*tti 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"}} }
                    ]);
Run Code Online (Sandbox Code Playgroud)

这将产生:

{ "_id" : "num_doors", "y" : [ 4 ], "size" : 1 }
{ "_id" : "color", "y" : [ "blue", "red" ], "size" : 2 }
{
    "_id" : "car_type",
    "y" : [
        "wagon",
        "hatchback",
        "suv"
    ],
    "size" : 3
}
Run Code Online (Sandbox Code Playgroud)

您可以$project根据$addFields需要包含或排除唯一值或大小的集合。