2014-10-07 11 views
6

को मिलाएं मेरे पास संग्रह में संग्रहीत निम्न प्रकार के दस्तावेज़ हैं।मोंगो डीबी एकत्रीकरण: दो एरे

{ 
    "_id" : "318036:2014010100", 
    "data": [ 
    {"flow": [6, 10, 12], "occupancy": [0.0356, 0.06, 0.0856], time: 0}, 
    {"flow": [2, 1, 4], "occupancy": [0.01, 0.0056, 0.0422], time: 30}, 
    ... 
    ] 
} 

मैं प्रथम, द्वितीय, ..., n वें प्रवाह और अधिभोग सरणियों में मूल्य से ऐसा एकत्रित मान की गणना करना चाहते हैं। सरणी के भीतर आदेश संरक्षित किया जाना चाहिए। मान लीजिए कि मैं योग की गणना करना चाहता हूं। परिणाम निम्नलिखित तरह दिखना चाहिए:

{ 
    "_id" : "318036:2014010100", 
    "data": [ 
    {"flow": [6, 10, 12], "occupancy": [0.0356, 0.06, 0.0856], sum: [6.0356, 10.006, 12.00856], time: 0}, 
    {"flow": [2, 1, 4], "occupancy": [0.01, 0.0056, 0.0422], sum: [2.01, 1.0056, 4.0422], time: 30}, 
    ... 
    ] 
} 

मैं एकत्रीकरण ढांचे लेकिन मेरे वर्तमान दृष्टिकोण का उपयोग कर आदेश की रक्षा नहीं करता है के द्वारा इस का समाधान करने की कोशिश की और भी बहुत कुछ रकम को पैदा करता है।

db.sens.aggregate([ 
    {$match: {"_id":/^318036:/}}, 
    {$limit: 1}, 
    {$unwind: "$data"}, 
    {$unwind: "$data.flow"}, 
    {$unwind: "$data.occupancy"}, 
    { 
    $group: { 
     _id: {id: "$_id", time: "$data.time", o: "$data.occupancy", f: "$data.flow", s: {$add: ["$data.occupancy", "$data.flow"]}} 
    } 
    }, 
    { 
    $group: { 
     _id: {id: "$_id.id", time: "$_id.time"}, occ: { $addToSet: "$_id.o"}, flow: {$addToSet: "$_id.f"}, speed: {$addToSet: "$_id.s"} 
    } 
    } 
]) 

मुझे यकीन है कि अगर यह एकत्रीकरण ढांचे के साथ इस समस्या को हल करने के लिए संभव है नहीं कर रहा हूँ, तो एक समाधान MapReduce का उपयोग कर भी ठीक होगा। मैं वांछित परिणाम कैसे उत्पन्न कर सकता हूं?

+0

मेरा मानना ​​है कि इस https://jira.mongodb.org/browse/SERVER-5919 एकत्रीकरण ढांचे के साथ समस्या को हल करने से रोकता है । दूसरी तरफ, मानचित्र को कम करने के साथ इसे पूरी तरह से संभव है। – joao

+0

परिणामस्वरूप आप अपेक्षा करते हैं कि मैं व्यक्तिगत रूप से थोड़ा सा परेशान हूं। "सेट्स" का आदेश नहीं दिया जाता है। सीटीओ खुद इतना कहता है और यह मूल रूप से एक सामान्य गणित सिद्धांत है। '$ समूह' पर "दोहरी पंप" उसकी ई आवश्यक नहीं है क्योंकि यह एक चरण में किया जा सकता है। मूल रूप से मुझे आपके मूल इनपुट के परिणामस्वरूप "आप क्या हासिल करना चाहते हैं" पर वापस लाएंगे? स्पष्ट रूप से नहीं कहा प्रतीत होता है। –

+0

मुझे विश्वास नहीं है कि 2.6 एकत्रीकरण ढांचे में ऐसा करने का एक तरीका है। मानचित्र/कम या क्लाइंट-साइड (प्री-प्रोसेसिंग) पर विचार करें। – wdberkeley

उत्तर

0

न एकत्रीकरण ढांचा है और न ही नक्शे के साथ एक वैकल्पिक समाधान/कम करने:

db.sens.find().forEach(function (doc) { 
    doc.data.forEach(function(dataElement) { 
     var sumArray = []; 
     for (var j = 0; j < dataElement.flow.length; j++) { 
     sumArray[j] = dataElement.flow[j] + dataElement.occupancy[j]; 
     } 
     dataElement.sum = sumArray; 
     collection.save(doc); 
    }); 
}); 
संबंधित मुद्दे