MongoDB聚合:计算不同的字段

时间:2013-08-29 01:47:45

标签: mongodb aggregation-framework

我正在尝试编写汇总来识别使用多个付款来源的帐户。典型的数据是。

{
 account:"abc",
 vendor:"amazon",
}
 ...
{
 account:"abc",
 vendor:"overstock",
}

现在,我想制作一个与此类似的帐户列表

{
 account:"abc",
 vendorCount:2
}

我将如何在Mongo的聚合框架中编写这个

8 个答案:

答案 0 :(得分:58)

我通过使用$ addToSet和$ unwind运算符来解决这个问题。

Mongodb Aggregation count array/set size

db.collection.aggregate([
{
    $group: { _id: { account: '$account' }, vendors: { $addToSet: '$vendor'} }
},
{
    $unwind:"$vendors"
},
{
    $group: { _id: "$_id", vendorCount: { $sum:1} }
}
]);

希望它有助于某人

答案 1 :(得分:22)

我认为如果执行下面的查询会更好,这将避免放松

db.t2.insert({_id:1,account:"abc",vendor:"amazon"});
db.t2.insert({_id:2,account:"abc",vendor:"overstock"});


db.t2.aggregate(
{ $group : { _id : { "account" : "$account", "vendor" : "$vendor" }, number : { $sum : 1 } } },
{ $group : { _id : "$_id.account", number : { $sum : 1 } } }
);

这会向您显示预期的结果。

{ "_id" : "abc", "number" : 2 }

答案 2 :(得分:13)

我不明白为什么有人必须使用$ group两次

db.t2.aggregate([ { $group: {"_id":"$account" , "number":{$sum:1}} } ])

这将完美无缺。

答案 3 :(得分:2)

您可以使用sets

db.test.aggregate([
    {$group: { 
      _id: "$account", 
      uniqueVendors: {$addToSet: "$vendor"}
    }},
    {$project: {
      _id: 1, 
      vendorsCount: {$size: "$uniqueVendors"}
    }}
]);

答案 4 :(得分:1)

这种方法没有利用$ unwind和其他额外的操作。另外,如果将新事物添加到聚合中,则不会有任何影响。公认的答案有一个缺陷。如果$ group中还有其他累积字段,则会在接受的答案的$ unwind阶段引起问题。

ID

答案 5 :(得分:-1)

db.UserModule.aggregate(
{ $group : { _id : { "companyauthemail" : "$companyauthemail", "email" : "$email" }, number : { $sum : 1 } } },
{ $group : { _id : "$_id.companyauthemail", number : { $sum : 1 } } }
);

答案 6 :(得分:-1)

要识别使用多种付款方式的帐户,请执行以下操作:

  1. 使用分组对来自多个帐户记录的数据进行计数,并将结果按帐户进行计数
  2. 使用区分大小写是仅过滤具有多种付款方式的此类帐户
  db.payment_collection.aggregate([ { $group: {"_id":"$account" ,
 "number":{$sum:1}} }, {
                     "$match": {
                         "number": { "$gt": 1 }
                      }
                 } ])

这将很好地工作,

答案 7 :(得分:-4)

一个例子

db.collection.distinct("example.item").forEach( function(docs) {
    print(docs + "==>>" + db.collection.count({"example.item":docs}))
});