Агрегация MongoDB: подсчет различных полей
Я пытаюсь написать агрегацию для идентификации учетных записей, которые используют несколько источников оплаты. Типичные данные.
{
account:"abc",
vendor:"amazon",
}
...
{
account:"abc",
vendor:"overstock",
}
Теперь я хотел бы создать список учетных записей, похожих на этот
{
account:"abc",
vendorCount:2
}
Как я могу написать это в инфраструктуре агрегации Mongo
Ответы
Ответ 1
Я понял это с помощью операторов $addToSet и $unwind.
Массив подсчета агрегатов Mongodb/заданный размер
db.collection.aggregate([
{
$group: { _id: { account: '$account' }, vendors: { $addToSet: '$vendor'} }
},
{
$unwind:"$vendors"
},
{
$group: { _id: "$_id", vendorCount: { $sum:1} }
}
]);
Надеюсь, что это поможет кому-то
Ответ 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}))
});