web-dev-qa-db-fra.com

Agrégation MongoDB: Comptage de champs distincts

J'essaie d'écrire une agrégation pour identifier les comptes qui utilisent plusieurs sources de paiement. Les données typiques seraient. 

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

J'aimerais maintenant produire une liste de comptes semblable à celle-ci.

{
 account:"abc",
 vendorCount:2
}

Comment pourrais-je écrire cela dans le cadre d'agrégation de Mongo

20
user1438162

J'ai compris cela en utilisant les opérateurs $ addToSet et $ unindind 

Mongodb Aggregation count array/set size

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

J'espère que ça aide quelqu'un

57
user1438162

Je pense que c'est mieux si vous exécutez une requête comme suit qui évitera de se dérouler

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

Ce qui vous montrera le résultat suivant qui est attendu.

{ "_id" : "abc", "number" : 2 }
18
Mayur Kataria

Je ne vois pas pourquoi quelqu'un devrait utiliser le groupe $ deux fois

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

Cela fonctionnera parfaitement bien.

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

Vous pouvez utiliser sets

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