2015-04-14 11 views
7

मैं दो दस्तावेज़ों इसMongoDB सरणी एकत्रीकरण

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

की तरह है मैं इस दो सूचियों के एकत्रित राशि की जरूरत है

उम्मीद उत्पादन:

[3, 5, 7, 9] 

यानी [2 + 1, 3 + 2 , 4 + 3, 5 + 4]

मुझे यह भी यकीन नहीं है कि यह मोंगोडीबी में संभव है या नहीं। इस पर कोई प्रकाश?

+0

हमेशा आपके आकार के 'vals' सरणी है? – Yogesh

+0

@ योगेश सं। लेकिन मैं जानना चाहता हूं कि आकार समान है या नहीं, तो यह हल करना संभव है या नहीं। – thavan

+0

मुझे लगता है कि यह मोंगो क्वेरी का उपयोग करना संभव नहीं होगा। और मेरी तरफ से +1। – Yogesh

उत्तर

0

क्षमा करें मैंने सही प्रश्न का उत्तर नहीं दिया। मैं सोच रहा था कि प्रत्येक ऑब्जेक्ट की सरणी को कैसे समेटना है। दो वस्तुओं के बीच सरणी नहीं जोड़ रहा है।

(ऊपर संपादित करें)

मैं इस के लिए नया हूँ, लेकिन मुझे लगता है कि आप समग्र ऑपरेटर $ खोलना है, जो तब सरणी विस्फोट $ योग "Vals" होगा उपयोग करना चाहते हैं। यह इस

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

की तरह दिखना चाहिए ऑपरेटरों यहाँ http://docs.mongodb.org/manual/reference/operator/aggregation-group/

यह ($ खोलना) का उल्लेख सरणी में प्रत्येक मान इतना बड़ा संग्रह के लिए अपनी स्मृति घड़ी के लिए एक दस्तावेज़ पैदा करेगा। यह ($ unwind) मेमोरी में विश्वास किया जाता है मुझे विश्वास है।

0

एकत्रीकरण ढांचा केवल एकत्रीकरण पाइपलाइन नहीं है।

बेशक आप भी मानचित्र का उपयोग कर सकते वास्तव में सरल कार्यों के साथ कम हो:

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

उत्पादन दस्तावेजों की एक सूची है, जहां _id सूचकांक है और value योग है। इस तरह:

[{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
बस एक अद्यतन के लिए

। यह mongoDB 3.2 की आगामी रिलीज में एकत्रीकरण ढांचे में संभव है। उन्होंने includeArrayIndex नामक मोंगो डीबी एकत्रीकरण के चरण को अनदेखा करने के लिए सरणी की अनइंड इंडेक्स प्राप्त करने के लिए एक नई सुविधा जोड़ा है।

इस सुविधा का उपयोग आप फार्म की कुल क्वेरी का उपयोग कर सकते हैं:

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

स्पष्टीकरण:

  • खोलना आपरेशन Vals सरणी unwinds और भी परियोजनाओं खोलना की सरणी सूचकांक। तो विचार समान इंडेक्स को समूहित करना है ताकि हम उन्हें
  • जोड़ सकें, फिर हम vals तत्व को संकलित करते समय सरणी इंडेक्स पर आधारित समूह बनाते हैं।इस चरण में हम पूरी तरह से इसी सूचकांक तत्वों
  • अगला हम तरह arrayIndex के आधार पर अभिव्यक्त किया है तो के रूप में अंतिम परिणाम सरणी के लिए
  • अगला हम समूह सभी दस्तावेजों को तैयार करने और एक सरणी valSum
कहा जाता है के लिए रकम पुश करने के लिए

आउटपुट:

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

इस दृष्टिकोण का मुख्य लाभ यह है कि, आप एक ही लंबाई के एरे है की जरूरत नहीं है। इसके अलावा यह किसी भी इनपुट दस्तावेज ले सकता है। includeArrayIndex सुविधा के लिए धन्यवाद।

चीयर्स!

संबंधित मुद्दे