首页 文章

如何使用聚合在mongodb中执行count(列)?

提问于
浏览
1

我试图在mongodb中执行相当于以下查询:

按用户从销售组中选择计数(*),计数(类别),总和(价格)

以下是我的集合中的文档:

{
    "_id" : ObjectId("54da8b0aa7c80aed4a9f9f33"),
    "userincome" : "$100,000 - $200,000",
    "county" : "Los Angeles",
    "userstate" : "California",
    "usercity" : "Los Angeles",
    "price" : 100,
    "category" : "Swimwear",
    "usergender" : "Male"
}

这是我的聚合返回count(*)和sum(price),但我不知道如何添加count(类别) .

db['stream.sales'].aggregate([  
   {  
      $group:{  
         _id:"$usergender",
         price:{  
            $sum:"$price"
         },
         _count:{  
            $sum:1
         }
      }
   }
])

我知道我可以运行一个单独的聚合来获取计数(类别),但我想在聚合中进行,因为我不希望我的所有结果都被过滤,其中类别存在= true .

db['stream.sales'].aggregate([  
   {  
      $match:{  
         'category':{  
            "$exists":true
         }
      }
   },
   {  
      $group:{  
         _id:"$usergender",
         count:{  
            $sum:1
         }
      }
   }
]);

Edit:

能够在wdberkleys响应的帮助下找到解决方案:

db['stream.sales'].aggregate([
        { "$group" : { 
            "_id" : "$usergender",
            "count" : { "$sum" : 1 },
            "price" : { "$sum" : "$price" },
            "category" : { "$push" : "$category" }
        } },
        { "$project" : {
            "count" : 1,
            "size" : 1,
            "categories" : { "$size" : "$category" } 
        } }
    ])

1 回答

  • 2

    $group 期间将类别推送到集合,然后 $project 生成类别集合的大小:

    db.stream.sales.aggregate([
        { "$group" : { 
            "_id" : "$usergender",
            "count" : { "$sum" : 1 },
            "price" : { "$sum" : "$price" },
            "categories" : { "$addToSet" : "$category" }
        } },
        { "$project" : {
            "count" : 1,
            "size" : 1,
            "categories" : { "$size" : "$category" } 
        } }
    ])
    

相关问题