2015-04-14 14 views
7

mam dwa dokumenty jak tenMongoDB agregacja tablica

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

muszę zagregowaną sumę tych dwóch list

oczekiwany wynik:

[3, 5, 7, 9] 

tj [2 + 1, 3 + 2 , 4 + 3, 5 + 4]

Nie jestem nawet pewien, czy jest to możliwe w MongoDB. Jakieś światło na tym?

+0

jest twoja tablica 'vals' zawsze tego samego rozmiaru? – Yogesh

+0

@yogesh Nie. Ale chciałbym wiedzieć, czy można rozwiązać, jeśli rozmiar jest taki sam. – thavan

+0

Myślę, że nie będzie to możliwe przy użyciu zapytania mongo. I +1 z mojej strony. – Yogesh

Odpowiedz

0

Niestety nie odpowiedziałem poprawnie na pytanie. Zastanawiałem się, jak podsumować tablicę każdego obiektu. Nie dodawanie tablic między dwoma obiektami.

(edycja powyżej)

Jestem nowy w tym, ale myślę, że chcesz korzystać z łączną operator $ zrelaksować, która eksploduje tablicę następnie $ zsumować „Vals”. Powinien on wyglądać następująco

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

patrz tutaj http://docs.mongodb.org/manual/reference/operator/aggregation-group/

To ($ rozwinięcie) operatorzy będą tworzyć jeden dokument dla każdej wartości w tablicy więc obserwować swoją pamięć dla większych zbiorów. To ($ unwind) odbywa się w pamięci, w którą wierzę.

0

Struktura agregacji to nie tylko potok agregacji.

Oczywiście można również skorzystać z mapy zmniejszyć naprawdę proste funkcje:

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) 
} 

Wyjście znajduje się lista dokumentów, gdzie _id jest indeksem i value jest sumą. W ten sposób:

[{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

Tylko dla aktualizacji. Jest to możliwe w ramach agregacji w nadchodzącym wydaniu mongoDB 3.2. Dodali nową funkcję, aby uzyskać rozwijany indeks tablicy w etapie rozwijania $ agregacji mongoDB o nazwie includeArrayIndex.

Za pomocą tej funkcji można użyć zagregowany zapytania w postaci:

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

Objaśnienie:

  • rozwijającej operacja odwija ​​tablicę Vals, a także projekty indeks tablicy odpoczynek. Chodzi więc o zgrupowanie podobnych indeksów, abyśmy mogli je podsumować:
  • Następnie grupujemy w oparciu o arrayIndex, sumując element vals.Na tym etapie mamy doskonale podsumował odpowiednie elementy indeksu
  • Następnie sortowania w oparciu o arrayIndex tak aby przygotować się do ostatecznej tablicy wynikowej
  • Następnie grupowych wszystkie dokumenty i przesunąć kwot do tablicy o nazwie valSum

wyjściowa:

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

główną zaletą tego podejścia jest to, że nie trzeba mieć tablice samej długości. Może również przyjmować dowolną liczbę dokumentów wejściowych. Dzięki funkcji includeArrayIndex.

Pozdrawiam!

Powiązane problemy