2014-04-27 9 views
8

Ich versuche, die durchschnittlich ein ganzes Feld in Mongo mit der Aggregation Rahmen zu erhalten. Jedoch kann ich kein Beispiel finden, das es ohne einen Gruppenparameter verwendet.Mongo durchschnittliche Aggregationsanfrage ohne Gruppe

Ich habe folgende Dokumentstruktur:

{ 
     "_id" : ObjectId("5352703b61d2739b2ea44e4d"), 
     "Semana" : "2014-02-23 - 2014-03-01", 
     "bolsaDeValores" : "7", 
     "bvc" : "8", 
     "dollar" : "76", 
     "ecopetrol" : "51", 
     "dollarPrice" : "18" 
} 

Im Grunde, was ich tun möchte, ist den Durchschnittswert des BVC-Feldes zu erhalten, und andere numerischen ein, für die gesamte Kollektion in dem schnellstmöglichen (ohne MapReduce zu verwenden, da es weniger effizient ist als das Aggregation Framework).

Ich habe auch auf eine größer als Null Basis die Gruppe versucht, aber ohne Erfolg:

db.EvaluatedSentiments.aggregate([ 
    { "$group": { 
     "bvc" : {"$gt:0"} 
     }, 
     { 
      "bvc" : { "$avg" : "$bvc"} 
     } 
    } 
]) 

Ich schätze jede Hilfe, die Sie zur Verfügung stellen könnten.

Referenzen: Mongo aggregation manual

+0

Gruppe von null statt – Sammaye

+0

Sie erkennen, dass tatsächlich keine der Werte, die Sie tatsächlich numerische vorhanden sind, nicht wahr? Sie sind in Wirklichkeit alle Saiten. –

+0

Das ist sehr wahr ist, hatte ich nicht darüber klar, eine Lücke i, während die vales Speicherung gemacht. Danke – NicolasZ

Antwort

28

Zu allererst speichern numerische Werte als Zahlen. Danach können Sie eine einfache Anweisung den Mittelwert berechnen:

db.collection.aggregate({ 
    "$group": { 
    "_id": null, 
    "avg_bvc": { "$avg": "$bvc" } 
    } 
}) 

Sie können einfach mehr $avg Aggregationsoperatoren verwenden, um Mittelwerte für andere numerische Felder zu erhalten:

db.collection.aggregate({ 
    "$group": { 
    "_id": null, 
    "avg_bvc": { "$avg": "$bvc" }, 
    "avg_dollar": { "$avg": "$dollar" } 
    } 
}) 
+0

Danke, genau was ich brauchte. – NicolasZ

+2

fast verpasst die "_id": null. Dies wird alles in einem gruppieren! Genie! – Kay

2

Also, wenn Sie Ihre Daten tatsächlich numerisch wurde was ist es nicht und Ihre Absicht ist es, die Dokumente auszuschließen, die einen "größer als Null" Wert haben, dann fügen Sie eine $match Anweisung in Ihre Aggregationspipeline ein, um diese Dokumente "herauszufiltern":

db.EvaluatedSentiments.aggregate([ 
    { "$match": { 
     "bvc": { "$gt": 0 } 
    }}, 
    { "$group": { 
     "_id": null, 
     "bvc": { "$avg": "$bvc" } 
    }} 
]) 
+0

Vielen Dank Neil. – NicolasZ

+0

Ich möchte 0 Werteliste angezeigt werden in aber in avg muss ich Null auszuschließen .. In dieser Situation, die oben nicht funktioniert hat .. ist es possiiblities es zu bekommen – user3211705

Verwandte Themen