2015-04-14 15 views
7

ho due documenti come questoMongoDB aggregazione serie

{ "_id" : ObjectId("552cd26276b783ed66031cc4"), "vals" : [ 2, 3, 4, 5 ] } 
{ "_id" : ObjectId("552cd26e76b783ed66031cc5"), "vals" : [ 1, 2, 3, 4 ] } 

ho bisogno somma aggregata di queste due liste

risultato atteso:

[3, 5, 7, 9] 

cioè [2 + 1, 3 + 2 , 4 + 3, 5 + 4]

Non sono nemmeno sicuro se questo è possibile in MongoDB. Qualche luce su questo?

+0

è la matrice 'vals' delle stesse dimensioni sempre? – Yogesh

+0

@ yogesh No. Ma mi piacerebbe sapere se è possibile risolvere se la dimensione è la stessa. – thavan

+0

Penso che questo non sarà possibile usando la query di mongo. E +1 dal mio lato. – Yogesh

risposta

0

Siamo spiacenti ma non ho risposto correttamente alla domanda. Stavo pensando a sommare l'array di ogni oggetto. Non aggiungere gli array tra i due oggetti.

(immissione sopra)

Sono nuovo a questo, ma penso che si desidera utilizzare l'aggregato operatore di $ di svolgimento, che esploderà poi l'array $ sommare i "vals". Esso dovrebbe essere simile a questo

db.Test.aggregate([{$unwind:"$vals"},{$group:{_id:"$_id","TotalVals":{$sum:"$vals"}}}]) 

riferimento agli operatori qui http://docs.mongodb.org/manual/reference/operator/aggregation-group/

Questo ($ rilassarsi) creerà un documento per ogni valore nella matrice in modo da guardare la memoria per le collezioni più grandi. Questo ($ unwind) è fatto in memoria, credo.

0

L'infrastruttura di aggregazione non è solo la linea di aggregazione.

Naturalmente è anche possibile utilizzare la mappa a ridurre con funzioni molto semplici:

var map_function = function(){ 
    for(var i=0;i<this.vals.length;i++){ 
     emit(i,this.vals[i]); 
    } 
} 
var reduce_function = function(key, values){ 
    return Array.sum(values) 
} 

Il risultato è un elenco di documenti in cui la _id è l'indice e il value è la somma. Come questo:

[{u'_id': 0.0, u'value': 3.0}, 
{u'_id': 1.0, u'value': 5.0}, 
{u'_id': 2.0, u'value': 7.0}, 
{u'_id': 3.0, u'value': 9.0}] 
1

Solo per un aggiornamento. Questo è possibile nel quadro di aggregazione nella prossima versione di mongoDB 3.2. Hanno aggiunto una nuova funzionalità per ottenere l'indice di unwind dell'array nella fase $ unwind dell'aggregazione mongoDB chiamata includeArrayIndex.

Utilizzando questa funzione è possibile utilizzare query di aggregazione del modulo:

db.collection.aggregate(
    {$unwind: { path: "$vals", includeArrayIndex: "arrayIndex" }}, 
    {$group: { '_id': '$arrayIndex', sum : {$sum: '$vals'}}}, 
    {$sort: { '_id': 1 }}, 
    {$group : { '_id': null, valSum: {$push: '$sum'}}} 
) 

Spiegazione:

  • L'operazione di svolgimento si snoda la matrice vals e anche proietta l'indice di array di rilassarsi. Quindi l'idea è di raggruppare indici simili in modo che possiamo sommarli
  • Quindi raggruppiamo in base a arrayIndex mentre sommando l'elemento vals.In questa fase abbiamo sintetizzato perfettamente gli elementi di indicazione corrispondenti
  • successivo abbiamo ordinamento basato su arrayIndex modo da preparare matrice risultato finale
  • successivo gruppo che tutti i documenti e spingere le somme per un array chiamato valSum

uscita:

{ '_id': null, valSum: [3, 5, 7, 9] } 

Il principale vantaggio di questo approccio è che, non è necessario avere matrici di uguale lunghezza. Inoltre può prendere qualsiasi numero di documenti di input. Grazie alla funzione includeArrayIndex.

Cheers!

Problemi correlati