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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top