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
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
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 }
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.
db.UserModule.aggregate(
{ $group : { _id : { "companyauthemail" : "$companyauthemail", "email" : "$email" }, number : { $sum : 1 } } },
{ $group : { _id : "$_id.companyauthemail", number : { $sum : 1 } } }
);
Vous pouvez utiliser sets
db.test.aggregate([
{$group: {
_id: "$account",
uniqueVendors: {$addToSet: "$vendor"}
}},
{$project: {
_id: 1,
vendorsCount: {$size: "$uniqueVendors"}
}}
]);