Агрегация MongoDB: подсчет различных полей

Я пытаюсь написать агрегацию для идентификации учетных записей, которые используют несколько источников оплаты. Типичные данные.

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

Теперь я хотел бы создать список учетных записей, похожих на этот

{
 account:"abc",
 vendorCount:2
}

Как я могу написать это в инфраструктуре агрегации Mongo

Ответы

Ответ 2

Я думаю, что лучше, если вы выполните запрос вроде следующего, который позволит избежать разрыва

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 }

Ответ 3

Я не понимаю, почему кому-то придется дважды использовать $group

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

Это будет отлично работать.

Ответ 4

Вы можете использовать sets

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

Ответ 5

Этот подход не использует $ unwind и другие дополнительные операции. Кроме того, это не повлияет ни на что, если в объединение будут добавлены новые вещи. В принятом ответе есть недостаток. Если у вас есть другие накопленные поля в $ group, это вызовет проблемы на стадии $ unwind принятого ответа.

db.collection.aggregate([{
    "$group": {
        "_id": "$account",
        "vendors": {"$addToSet": "$vendor"}
    }
},
{
    "$addFields": {
        "vendorCount": {
            "$size": "$vendors"
        }
    }
}])

Ответ 6

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

Ответ 7

Пример

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