2014-04-27 15 views
8

Sto cercando di ottenere la media di un intero campo utilizzando il framework di aggregazione in Mongo. Tuttavia non riesco a trovare alcun esempio che lo utilizza senza un parametro di gruppo.Query di aggregazione media in mongolo senza gruppo

Ho la seguente struttura del documento:

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

Fondamentalmente quello che voglio fare è ottenere il valore medio del campo BVC, e qualsiasi altra numerica, per l'intera collezione del più veloce possibile modo (senza utilizzare MapReduce in quanto è meno efficiente di Aggregation Framework).

ho cercato di gruppo su una base maggiore di zero pure ma senza alcun risultato:

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

Apprezzo tutto l'aiuto è possibile fornire.

Riferimenti: Mongo aggregation manual

+0

Raggruppa per null invece – Sammaye

+0

Realmente ti rendi conto che nessuno dei valori che presenti sono effettivamente numerici, vero? Sono in realtà tutti gli archi. –

+0

Questo è molto vero, non me ne ero reso conto, un'omissione che ho fatto durante la memorizzazione delle vales. Grazie – NicolasZ

risposta

28

Innanzitutto memorizzano valori numerici come numeri. In seguito è possibile utilizzare una semplice dichiarazione per calcolare la media:

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

Si può semplicemente utilizzare più $avg operatori di aggregazione per ottenere le medie per gli altri campi numerici:

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

Grazie, esattamente quello di cui avevo bisogno. – NicolasZ

+2

quasi mancato il "_id": null. questo lo raggrupperà tutto in uno! genio! – Kay

2

Quindi, se i dati in realtà era numerici quale non è e la tua intenzione è di escludere i documenti che hanno un valore "maggiore di zero" allora includi un'istruzione $match nella tua pipeline di aggregazione per "filtrare" questi documenti:

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

Grazie mille Neil. – NicolasZ

+0

Voglio che il valore 0 venga visualizzato nell'elenco ma in avg ho bisogno di escludere zero .. In questa situazione il lavoro precedente non ha funzionato .. ci sono possibilità di ottenerlo – user3211705

Problemi correlati