web-dev-qa-db-fra.com

Agrégation distincte MongoDB

Je travaille sur une requête pour trouver les villes avec le plus de zips pour chaque état:

db.zips.distinct("state", db.zips.aggregate([ {$group:{_id:{state:"$state", city:"$city"},numberOfzipcodes:{$sum:1}}}, {$sort:{numberOfzipcodes:-1}}]))

La partie agrégée de la requête semble fonctionner correctement, mais lorsque j'ajoute le distinct, j'obtiens un résultat vide.

Est-ce parce que j'ai un état dans l'ID? Puis-je faire quelque chose comme distinct("_id.state?

29
Lemonio

Distinct et le cadre d'agrégation ne sont pas interopérables.

Au lieu de cela, vous voulez juste:

db.zips.aggregate([ 
    {$group:{_id:{city:'$city', state:'$state'}, numberOfzipcodes:{$sum:1}}}, 
    {$sort:{numberOfzipcodes:-1}},
    {$group:{_id:'$_id.state', city:{$first:'$_id.city'}, 
              numberOfzipcode:{$first:'$numberOfzipcodes'}}}
]);
39
Sammaye

Vous pouvez utiliser $ addToSet avec le framework d'agrégation pour compter des objets distincts.

Par exemple:

db.collectionName.aggregate([{
    $group: {_id: null, uniqueValues: {$addToSet: "$fieldName"}}
}])
75
dam1

Requête SQL: (regrouper par & nombre de distincts)

select city,count(distinct(emailId)) from TransactionDetails group by city;

La requête mongo équivalente ressemblerait à ceci:

db.TransactionDetails.aggregate([ 
{$group:{_id:{"CITY" : "$cityName"},uniqueCount: {$addToSet: "$emailId"}}},
{$project:{"CITY":1,uniqueCustomerCount:{$size:"$uniqueCount"}} } 
]);
16
Surendranath Reddy K