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

मोंगोडीबी:किसी सरणी में किसी दिए गए मान के साथ कितने आइटम मौजूद हैं, यह एक दस्तावेज़ में है?

एकत्रीकरण ढांचा ऐसे के लिए आदर्श है। वांछित परिणाम प्राप्त करने के लिए निम्न पाइपलाइन चलाने पर विचार करें।

pipeline = [
    {
        "$match": {
            "name": "james",
            "books.year": 1990
        }
    },
    {
        "$project": {
            "numberOfBooks": {
                "$size": {                  
                    "$filter": {
                        "input": "$books",
                        "as": "el",
                        "cond": { "$eq": [ "$$el.year", 1990 ] }
                    }                   
                }
            }
        }
    }
];
db.collection.pipeline(pipeline);

उपरोक्त पाइपलाइन नए $filter मोंगोडीबी 3.2 के लिए उपलब्ध ऑपरेटर एक सरणी का उत्पादन करने के लिए जो निर्दिष्ट शर्त को पूरा करता है यानी यह बाहरी तत्वों को फ़िल्टर करता है जो मानदंडों को पूरा नहीं करते हैं। आरंभिक $match कोड> पाइपलाइन अनुकूलन कार्यनीति के रूप में एकत्रीकरण पाइपलाइन में आने वाले दस्तावेज़ों को जल्दी से फ़िल्टर करने के लिए पाइपलाइन आवश्यक है।

$size ऑपरेटर जो एक अभिव्यक्ति को तर्क के रूप में स्वीकार करता है, फिर आपको परिणामी सरणी में तत्वों की संख्या देता है, इस प्रकार आपकी वांछित पुस्तक गणना होती है।

एक वैकल्पिक समाधान के लिए जो $ का उपयोग नहीं करता है। फ़िल्टर पिछले संस्करणों में ऑपरेटर नहीं मिला, निम्नलिखित पाइपलाइन संचालन पर विचार करें:

pipeline = [
    {
        "$match": {
            "name": "james",
            "books.year": 1990
        }
    },
    {
        "$project": {
            "numberOfBooks": {
                "$size": {                  
                    "$setDifference": [
                        {
                            "$map": {
                                "input": "$books",
                                "as": "el",
                                "in": {
                                    "$cond": [
                                        { "$eq": [ "$$el.year", 1990 ] },
                                        "$$el",
                                        false
                                    ]
                                }
                            }
                        },
                        [false]
                    ]                   
                }
            }
        }
    }
];
db.collection.pipeline(pipeline);

$project पाइपलाइन चरण में पुस्तकों की सरणी को फ़िट करना शामिल है ताकि आप उन दस्तावेज़ों को हटा दें जिनमें वर्ष 1990 नहीं है। यह $setDifference और $map ऑपरेटरों।

$map ऑपरेटर संक्षेप में एक नया सरणी फ़ील्ड बनाता है जो एक सरणी के प्रत्येक तत्व के लिए एक उप-अभिव्यक्ति में मूल्यांकन किए गए तर्क के परिणामस्वरूप मान रखता है। $setDifference ऑपरेटर तब तत्वों के साथ एक सेट देता है जो पहले सेट में दिखाई देता है लेकिन दूसरे सेट में नहीं; यानी पहले के सापेक्ष दूसरे सेट का एक सापेक्ष पूरक करता है। इस मामले में यह अंतिम पुस्तकें सरणी लौटाएगा जिसमें वर्ष 1990 के साथ तत्व हैं और बाद में $आकार परिणामी सरणी में तत्वों की संख्या की गणना करता है, इस प्रकार आपको पुस्तक संख्या देता है।

ऐसे समाधान के लिए जो का इस्तेमाल करता हो $अनविंड ऑपरेटर, इस बात को ध्यान में रखते हुए (टिप्पणियों में @BlakesSeven की इस व्यावहारिक प्रतिक्रिया के लिए धन्यवाद):

और अंतिम उपाय के रूप में, निम्न पाइपलाइन चलाएँ:

pipeline = [
    {
        "$match": {
            "name": "james",
            "books.year": 1990
        }
    },
    { "$unwind": "$books" },
    {
        "$match": { "books.year": 1990 }
    },
    {
        "$group": {
            "_id": null
            "count": { "$sum": 1 }
        }
    }
]
db.collection.pipeline(pipeline)


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. जांचें कि क्या मोंगोडब डेटाबेस मौजूद है?

  2. mongodb में स्ट्रिंग प्रकार दिनांक को क्वेरी करें

  3. नेवला में उप-दस्तावेज़ पेजिनेशन

  4. MongoDB दस्तावेज़ बहुत जल्द समाप्त हो रहे हैं (नेवला)

  5. MongoDB सटीक ऐरे मैच खोजें लेकिन ऑर्डर कोई मायने नहीं रखता