【问题标题】:Distinct count of multiple fields values using mongodb aggregation使用 mongodb 聚合的多个字段值的不同计数
【发布时间】:2021-12-01 22:42:39
【问题描述】:

我正在尝试通过一个 MongoDB 聚合查询来计算多个字段的不同值。

这是我的数据:

{
"_id":ObjectID( "617b0dbacda6cbd1a0403f68")
"car_type": "suv",
"color": "red",
"num_doors": 4
},

{
"_id":ObjectID( "617b0dbacda6cbd1a04078df")
    "car_type": " suv ",
    "color": "blue",
    "num_doors": 4

},
{
"_id":ObjectID( "617b0dbacda6cbd1a040ld45")
    "car_type": "wagon",
    "color": "red",
    "num_doors": 4
},
{
"_id":ObjectID( "617b0dbacda6cbd1a0403dcd")
    "car_type": "suv",
    "color": "blue",
    "num_doors": 4
},
{
"_id":ObjectID( "617b0dbacda6cbd1a0403879")
    "car_type": " wagon ",
    "color": "red",
    "num_doors": 4
},
{
"_id":ObjectID( "617b0dbacda6cbd1a0405478")
    "car_type": "wagon",
    "color": "red",
    "num_doors": 4
}

我想按 car_type 对每种颜色进行不同的计数:

"car_type": "suv"
"red":2,
"blue":2

我能够区分和计算所有颜色,但我无法通过 car_type 区分它们

【问题讨论】:

    标签: node.js mongodb aggregation-framework mean-stack meanjs


    【解决方案1】:

    查询

    • 先特定组(车型+颜色),以计算相同的颜色
    • 在 (cartype) 之后的组不太具体,以获取每个 car_type 的所有颜色/计数
    • 修复结构的项目和 $arrayToObject 制作颜色键和计数值

    *query 假设 " wagon " 输入错误(我的意思是多余的空格),如果您的集合有这些问题,请使用 $trim 清除这些数据库。

    *查询已更新以包含总和,来自评论

    Test code here

    aggregate(
    [{"$group": 
        {"_id": {"car_type": "$car_type", "color": "$color"},
          "count": {"$sum": 1}}},
      {"$group": 
        {"_id": "$_id.car_type",
          "colors": {"$push": {"k": "$_id.color", "v": "$count"}}}},
      {"$set": {"sum": {"$sum": "$colors.v"}}},
      {"$project": 
        {"_id": 0,
          "sum": 1,
          "car_type": "$_id",
          "colors": {"$arrayToObject": ["$colors"]}}},
      {"$replaceRoot": {"newRoot": {"$mergeObjects": ["$colors", "$$ROOT"]}}},
      {"$project": {"colors": 0}}])
    

    【讨论】:

    • 有什么方法可以将我尝试过的每辆车的总和相加,但每次我只得到颜色的数量。我想得到什么的例子:{“car_type”:“suv”“red”:2,“blue”:2,“sum”:4}
    • 是的,它很容易改变,我添加了{"$set": {"sum": {"$sum": "$colors.v"}}},我认为它还可以,测试它以确保它满足你的需要
    • 是的,它工作得很好,谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 2013-09-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多