Metodi aggregati mongoidi su documenti incorporati?
-
28-10-2019 - |
Domanda
Come posso eseguire aggregati, min, max, somma e amici su documenti incorporati?
Per esempio:
Ottieni il costo medio di tutti gli eventi che un distretto ha, in cui sono abbastanza incorporati.
District.schools.all.events.all.costs.avg(:value)
Ovviamente non funziona.
District.avg('schools.events.costs.value')
Nemmeno quello. Fornisce questo messaggio di errore:
Mongo::OperationFailure: Database command 'group' failed: (errmsg: 'exception: reduce
invoke failed: JS Error: TypeError: obj.schools
has no properties reduce setup:1'; code: '9010'; ok: '0.0').
Quindi è possibile o devo scrivere la mia mappa/ridurre le funzioni?
Soluzione
Sì, MapReduce funzionerebbe. È inoltre possibile utilizzare i cursori per elaborare un risultato di query. Piace:
min = 99999999;
max = -99999999;
sum = 0;
count = 0
db.School.find({}).forEach(function(s) {
if (s.first.events.first.cost < min)
min = s.first.events.first.cost;
if (s.first.events.first.cost > max)
max = s.first.events.first.cost;
sum += s.first.events.first.cost;
++count;
});
Ora hai il min e il massimo e puoi calcolare la media e la media dalla somma e dal conteggio.
MongoDB non ha la capacità di calcolare direttamente le funzioni aggregate nel suo linguaggio di query. In realtà, questa affermazione non è del tutto vera, poiché esiste la funzione Count () per contare il numero di risultati restituiti da una query e c'è la funzione Group (). Ma la funzione di gruppo è molto simile a un mapReduce e non può essere utilizzata su database sharded. Se sei interessato alla funzione del gruppo, vedi: http://www.mongodb.org/display/docs/aggregation#aggregation-group