代码之家  ›  专栏  ›  技术社区  ›  Deckard

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

  •  6
  • Deckard  · 技术社区  · 7 年前

    这是我的数据:

    {
        "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
    

    我能够对多个字段进行分组,然后进行不同的计数,但它只能对第一个字段进行计数。不是所有人。 这也是一个大数据集。

    2 回复  |  直到 7 年前
        1
  •  5
  •   chridam Gino Claudi    7 年前

    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" }
            }
        }
    ])
    
        2
  •  1
  •   Buzz Moschetti    7 年前

    $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 如您所见,可以包括或排除唯一值集或大小。