.distinct()
के साथ क्वेरी शर्तें
"दस्तावेज़ चयन" पर लागू होता है न कि दस्तावेज़ में "भीतर" वाली सरणी प्रविष्टियाँ। यदि आपको सरणी सामग्री को "फ़िल्टर" करने की आवश्यकता है तो आप .एग्रीगेट ()
इसके बजाय, साथ ही साथ सरणी प्रतिक्रिया में केवल "मान" प्राप्त करने के लिए थोड़ा पोस्ट प्रोसेसिंग।
db.collection.aggregate([
{ "$match": { "_id": "TEST" } },
{ "$unwind": "$payload" },
{ "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } },
{ "$group": { "_id": "$payload._id" } },
]).map( d => d._id );
मुख्य भाग हैं $unwind
पाइपलाइन चरण जो आप मुख्य रूप से करते हैं क्योंकि आप चाहते हैं कि सरणी के भीतर के मान बाद में $समूह
पर। यह अनिवार्य रूप से प्रत्येक सरणी सदस्य के लिए एक नया दस्तावेज़ तैयार करता है, लेकिन प्रत्येक दस्तावेज़ में केवल वह सरणी सदस्य होता है। यह MongoDB संरचनाओं के लिए "डिनॉर्मलाइज़िंग" है जिसमें सरणियाँ होती हैं।
अगली चीज़ निम्न है $match
पाइपलाइन, जो किसी भी क्वेरी की तरह काम करती है और केवल शर्तों से मेल खाने वाले दस्तावेज़ों का चयन करती है। चूंकि सभी सरणी सदस्य अब "दस्तावेज़" हैं, इसलिए गैर मिलान प्रविष्टियां (दस्तावेज़ों के रूप में) को बाहर रखा गया है। आप वैकल्पिक रूप से $filter
का उपयोग कर सकते हैं
अभी भी एक सरणी निकालने के लिए, लेकिन चूंकि हमें $unwind की आवश्यकता है
अगले चरण के लिए हम बस $मिलान
. भी कर सकते हैं ।
इस बिंदु पर आप केवल उन सरणी प्रविष्टियों के साथ बचे हैं जो शर्तों से मेल खाती हैं। $group
"विशिष्ट" मान प्राप्त करना है, इसलिए आम तौर पर आप इसे केवल एक दस्तावेज़ या किसी भी चीज़ की तुलना में व्यापक चयन पर करेंगे जहां यहां मान पहले से अलग नहीं हैं। तो यह वास्तव में केवल के समान व्यवहार को बनाए रखना है .विशिष्ट ()
बरकरार।
अंत में, .aggregate()<के आउटपुट के बाद से /कोड>
.distinct()के डिज़ाइन से अलग है कोड>
इसमें यह परिणामों में "दस्तावेज़" देता है, हम बस .मैप ()
कर्सर परिणामों को संसाधित करने के लिए विधि और विशिष्ट दस्तावेज़ संपत्ति से "सरणी" के रूप में केवल "मान" लौटाएं।