यह वास्तव में $elemMatch
ऑपरेटर के लिए है, भले ही इसका अक्सर दुरुपयोग किया जाता है। यह अनिवार्य रूप से सरणी के "भीतर" प्रत्येक तत्व पर क्वेरी शर्तों को निष्पादित करता है। सभी MongoDB तर्क एक "और" ऑपरेशन हैं जब तक कि स्पष्ट रूप से अन्यथा नहीं कहा जाता है:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
आप शायद यहां भी "प्रोजेक्ट" करना चाहते हैं यदि आप केवल मेल खाने वाले फ़ील्ड की अपेक्षा कर रहे हैं और पूरे दस्तावेज़ की नहीं:
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
अंत में यह समझाने के लिए कि आपका दूसरा प्रयास क्यों काम नहीं करता, यह प्रश्न:
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
किसी भी चीज़ से मेल नहीं खाता क्योंकि ऐसा कोई वास्तविक दस्तावेज़ नहीं है जहाँ "arr" में आपकी शर्तों से बिल्कुल मेल खाने वाला एकवचन तत्व हो।
आपका पहला उदाहरण विफल..:
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
क्योंकि कई सरणी तत्व हैं जो शर्तों को पूरा करते हैं और यह केवल यह नहीं माना जाता है कि दोनों शर्तें एक ही तत्व पर लागू होती हैं। यही है $elemMatch
जोड़ता है, और जब आपको मिलान करने के लिए उस एक शर्त से अधिक की आवश्यकता होती है, तो यह वह जगह है जहां आप इसका उपयोग करते हैं।