2015-04-14 15 views
7

Bunu iki liste birleştirilmiş toplamı mi BuMongoDB dizi agregasyon

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

gibi iki belgeleri

beklenen çıktı:

[3, 5, 7, 9] 

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

MongoDB'de bunun mümkün olup olmadığından emin değilim. Bunun üzerinde herhangi bir ışık var mı?

+0

, her zaman aynı büyüklükteki vals dizindir? – Yogesh

+0

@yogesh Hayır. Ama boyutun aynı olup olmadığını çözmek mümkün olup olmadığını bilmek istiyorum. – thavan

+0

Bu mongo sorgusu kullanılarak mümkün olmayacağını düşünüyorum. Ve benim tarafımdan +1. – Yogesh

cevap

0

Üzgünüm, soruyu doğru cevaplamadım. Her nesnenin dizisini nasıl toplayacağımı düşünüyordum. İki nesne arasındaki dizileri eklemiyorum.

(yukarıdaki düzenle)

bunun için yeni duyuyorum ama $ sonra diziyi patlayabilir "vals" özetleyecek agrega operatör $ açılımı, kullanmak istediğiniz düşünüyorum. O kadar büyük koleksiyonları için hafızanızı izlemek dizideki her değer için bir doküman oluşturacaktır burada http://docs.mongodb.org/manual/reference/operator/aggregation-group/

Bu ($ açma) operatörleri bakın bu

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

gibi görünmelidir. Bu ($ unwind) inanıyorum inanıyorum bellek.

0

Toplama çerçevesi yalnızca toplama boru hattı değildir. _id endeksidir ve value toplamı olduğu

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

çıktı belgelerin listesi: Ayrıca gerçekten basit fonksiyonları ile azaltmak haritayı kullanabilirsiniz Tabii

. Şunun gibi: Sadece bir güncelleştirme için

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

. Bu, mongoDB 3.2'nin piyasaya sürülmesindeki toplanma çerçevesinde mümkündür. includeArrayIndex adı verilen mongoDB topluluğunun $ unwind aşamasında dizinin gevşeme dizinini almak için yeni bir özellik eklediler.

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

Açıklama: formun toplam sorgusu kullanabilirsiniz Bu özelliği kullanarak

  • açma işlemi de vals dizisini açmak sureti ile bir çile çözme mekanizması dizi indeksi yansıtır. Bu yüzden fikir, benzer indeksleri gruplayabilmemiz için
  • Bunları vals elementini toplarken arrayIndex'e göre gruplandırıyoruz.Nihai sonuç dizisi için
  • Sonra grup tüm belgeleri hazırlayıp
valSum denilen bir diziye meblağlar itmek amacıyla bu aşamada biz mükemmel bir nevi arrayIndex dayalı karşılık gelen dizin elemanlarını
  • Sonraki özetlenebilir

    Çıktı: Bu yaklaşımın

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

    ana avantajı, aynı uzunlukta diziler olması gerekmez, yani. Ayrıca herhangi bir sayıda giriş belgesi alabilir. includeArrayIndex özelliği sayesinde.

    Şerefe!