MapReduce धीमा है, लेकिन यह बहुत बड़े डेटा सेट को संभाल सकता है। दूसरी ओर एकत्रीकरण ढांचा थोड़ा तेज है, लेकिन बड़ी मात्रा में डेटा के साथ संघर्ष करेगा।
आपकी संरचना के साथ समस्या यह है कि डेटा को खोलने के लिए आपको सरणियों को "$ खोलना" चाहिए। इसका मतलब है कि प्रत्येक सरणी आइटम के लिए एक नया दस्तावेज़ बनाना और एकत्रीकरण ढांचे के साथ इसे स्मृति में करने की आवश्यकता है। इसलिए यदि आपके पास 100 सरणी तत्वों के साथ 1000 दस्तावेज़ हैं, तो उसे समूहबद्ध करने और उन्हें गिनने के लिए 100,000 दस्तावेज़ों की एक धारा बनाने की आवश्यकता होगी।
आप यह देखने पर विचार करना चाहेंगे कि क्या कोई स्कीमा लेआउट है जो आपके प्रश्नों को बेहतर तरीके से सर्वर करेगा, लेकिन यदि आप इसे एकत्रीकरण ढांचे के साथ करना चाहते हैं तो आप इसे कैसे कर सकते हैं (कुछ नमूना डेटा के साथ पूरी स्क्रिप्ट खोल में गिर जाएगी);
db.so.remove();
db.so.ensureIndex({ "items.sku": 1}, {unique:false});
db.so.insert([
{
_id: 42,
last_modified: ISODate("2012-03-09T20:55:36Z"),
status: 'active',
items: [
{ sku: '00e8da9b', qty: 1, item_details: {} },
{ sku: '0ab42f88', qty: 4, item_details: {} },
{ sku: '0ab42f88', qty: 4, item_details: {} },
{ sku: '0ab42f88', qty: 4, item_details: {} },
]
},
{
_id: 43,
last_modified: ISODate("2012-03-09T20:55:36Z"),
status: 'active',
items: [
{ sku: '00e8da9b', qty: 1, item_details: {} },
{ sku: '0ab42f88', qty: 4, item_details: {} },
]
},
]);
db.so.runCommand("aggregate", {
pipeline: [
{ // optional filter to exclude inactive elements - can be removed
// you'll want an index on this if you use it too
$match: { status: "active" }
},
// unwind creates a doc for every array element
{ $unwind: "$items" },
{
$group: {
// group by unique SKU, but you only wanted to count a SKU once per doc id
_id: { _id: "$_id", sku: "$items.sku" },
}
},
{
$group: {
// group by unique SKU, and count them
_id: { sku:"$_id.sku" },
doc_count: { $sum: 1 },
}
}
]
//,explain:true
})
ध्यान दें कि मैंने दो बार $group'd किया है, क्योंकि आपने कहा था कि एक SKU प्रति दस्तावेज़ केवल एक बार गिन सकता है, इसलिए हमें पहले अद्वितीय doc/sku युग्मों को छाँटने और फिर उन्हें गिनने की आवश्यकता है।
यदि आप आउटपुट थोड़ा अलग चाहते हैं (दूसरे शब्दों में, बिल्कुल आपके नमूने की तरह) तो हम उन्हें $ प्रोजेक्ट कर सकते हैं।