38

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

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

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

{
 account:"abc",
 vendorCount:2
}

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

4

8 回答 8

72

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

Mongodb聚合计数数组/集合大小

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

希望它可以帮助某人

于 2013-08-29T03:26:48.643 回答
25

我认为如果您执行如下查询会更好,这将避免展开

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 }
于 2015-01-16T08:17:18.287 回答
16

您可以使用sets

db.test.aggregate([
    {$group: { 
      _id: "$account", 
      uniqueVendors: {$addToSet: "$vendor"}
    }},
    {$project: {
      _id: 1, 
      vendorsCount: {$size: "$uniqueVendors"}
    }}
]);
于 2018-03-10T14:45:03.073 回答
12

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

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

这将完全正常。

于 2015-07-16T04:50:11.893 回答
3

这种方法不使用 $unwind 和其他额外的操作。另外,如果将新事物添加到聚合中,这不会影响任何事情。接受的答案存在缺陷。如果您在 $group 中有其他累积字段,则会导致已接受答案的 $unwind 阶段出现问题。

db.collection.aggregate([{
    "$group": {
        "_id": "$account",
        "vendors": {"$addToSet": "$vendor"}
    }
},
{
    "$addFields": {
        "vendorCount": {
            "$size": "$vendors"
        }
    }
}])
于 2019-09-18T11:19:36.660 回答
-1

要识别使用多个付款来源的帐户:

  1. 使用分组对多个账户记录中的数据进行计数,并按账户对结果进行分组
  2. 使用匹配案例仅过滤具有多种付款方式的帐户
  db.payment_collection.aggregate([ { $group: {"_id":"$account" ,
 "number":{$sum:1}} }, {
                     "$match": {
                         "number": { "$gt": 1 }
                      }
                 } ])

这将工作得很好,

于 2020-05-11T11:31:08.473 回答
-3
db.UserModule.aggregate(
{ $group : { _id : { "companyauthemail" : "$companyauthemail", "email" : "$email" }, number : { $sum : 1 } } },
{ $group : { _id : "$_id.companyauthemail", number : { $sum : 1 } } }
);
于 2018-08-11T05:04:41.530 回答
-5

一个例子

db.collection.distinct("example.item").forEach( function(docs) {
    print(docs + "==>>" + db.collection.count({"example.item":docs}))
});
于 2016-07-05T21:16:00.257 回答