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

时间:2015-02-12 16:43:58

标签: mongodb mongodb-query aggregation-framework

我正在尝试相当于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(category)。

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
         }
      }
   }
]);

修改

能够在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 个答案:

答案 0 :(得分: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" } 
    } }
])