MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

सरणी में उप-दस्तावेज़ पर मोंगोडब समुच्चय

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 युग्मों को छाँटने और फिर उन्हें गिनने की आवश्यकता है।

यदि आप आउटपुट थोड़ा अलग चाहते हैं (दूसरे शब्दों में, बिल्कुल आपके नमूने की तरह) तो हम उन्हें $ प्रोजेक्ट कर सकते हैं।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नेवला - दिनांक को केवल दिनांक भाग के आधार पर क्रमबद्ध करें, समय को अनदेखा करें

  2. मोंगोडब सीपीपी ड्राइवर में लापता lboost_thread-mt (उबंटू सर्वर x64)

  3. Mongodb अपवाद, MongoCursorException' संदेश के साथ '$ ऑपरेटर ने वस्तु को बहुत बड़ा बना दिया इसका क्या अर्थ है?

  4. findOneAndUpdate कोई फ़ंक्शन नहीं है

  5. SQL DB की तुलना में MongoDB बहुत तेज़ क्यों है, इसके लिए कोई विस्तृत और विशिष्ट कारण?