it-swarm.com.de

MongoDB eindeutige Aggregation

Ich arbeite an einer Abfrage, um Städte mit den meisten Reißverschlüssen für jedes Bundesland zu finden:

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

Der aggregierte Teil der Abfrage scheint in Ordnung zu sein, aber wenn ich den Unterschied hinzufüge, erhalte ich ein leeres Ergebnis.

Liegt das daran, dass ich einen Status in der ID habe? Kann ich so etwas tun wie distinct("_id.state?

29
Lemonio

Distinct und das Aggregationsframework sind nicht interoperabel.

Stattdessen möchten Sie nur:

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

Sie können $ addToSet mit dem Aggregationsframework verwenden, um verschiedene Objekte zu zählen.

Beispielsweise:

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

SQL-Abfrage: (Gruppieren nach & Anzahl der eindeutigen)

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

Eine äquivalente Mongo-Abfrage würde folgendermaßen aussehen:

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