2013-05-03 16 views
15

ich lerne gerade mongoDB für eine Zuordnung, ich bin auf einer Abfrage arbeiten für jeden Zustand Städte mit den meisten Reißverschlüssen zu findenMongoDB deutliche Aggregation

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

das Aggregat Teil der Abfrage zu funktionieren scheint, aber wenn ich das distinct addiere, bekomme ich ein leeres Ergebnis. Ist das so, weil ich in der ID State habe? Sie kann ich wie verschiedene etwas tun ("_ id.state ?? oder haben Sie weitere Tipps?

Thank you!

+1

Für die Suche nach, wie Sie mit Mongo Aggregation, um unterschiedliche Werte zu erhalten, versuchen Sie dies (inspiriert von [dam1's Antwort] (http://Stackoverflow.com/a/35187100/3391108) und [Mongos Dokumentation] (https://docs.mongodb.com/manual/reference/ Betreiber/Aggregation/Anzeige dToSet/# Beispiel)): 'db.collectionName.aggregate ([{$ gruppe: {_id: null, uniqueValues: {$ addToSet:" $ fieldName "}}})' – tscizzle

Antwort

23

Distinct und die Aggregation Rahmen sind nicht dialogfähig.

Statt nur wollen:

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'}}} 
]); 
+5

@ alex23 Distinct ist ein komplett anderer Befehl was ein Array von verschiedenen Werten zurückgibt. Es ist völlig inkompatibel mit der Aggregation Framework – Sammaye

+0

Dies ist eine Abfrage, die ich zuvor hatte, aber ich brauche die verschiedenen Städte für jeden Staat nicht die Staaten – Lemonio

+0

@Lemonio Hinzugefügt Stadt zurück in, das sollte die Reißverschlüsse in jeder Stadt geben in jedem Staat jetzt – Sammaye

33

Sie $addToSet mit dem Aggregations Framework verwenden können verschiedene Objekte zählen

. Zum Beispiel:

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

Dies ist die eigentliche Lösung. – alfredopacino

+2

Keine generische Lösung, wenn Sie eine große Anzahl eindeutiger Postleitzahlen pro Ergebnis haben, wäre dieses Array sehr groß. Die Frage war, die Stadt mit den meisten Postleitzahlen für jeden Staat zu bekommen, nicht die tatsächlichen Postleitzahlen zu bekommen. Was passiert, wenn Sie 10.000.000 Postleitzahlen für eine bestimmte Stadt haben? –

2

SQL Query: (Gruppe von & Zählt eindeutig)

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

Equivalent Mongo Abfrage würde wie folgt aussehen:

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