मैं इसे एक उदाहरण के साथ समझाऊंगा। संग्रह पर विचार करें arrays . इसमें arr . नामक एक फ़ील्ड है जो एम्बेडेड दस्तावेज़ों की एक सरणी . है (फ़ील्ड के साथ a और b )।
arrays में कुछ दस्तावेज़ संग्रह:
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 2, "arr" : [ { "a" : "a1", "b" : "b11" }, { "a" : "a2", "b" : "b22" } ] }
{ "_id" : 3, "arr" : [ { "a" : "a2", "b" : "b1" }, { "a" : "a", "b" : "b1" } ] }
{ "_id" : 4, "arr" : [ { "a" : "a1", "b" : "b91" }, { "a" : "a29", "b" : "b1" } ] }
मैं सरणी एम्बेडेड-दस्तावेज़ फ़ील्ड के साथ सभी दस्तावेज़ ढूंढना चाहता हूं a="a1" और b="b1" . ध्यान दें कि यह सरणी के एम्बेडेड-दस्तावेज़ के समान तत्व के भीतर होना चाहिए। मैं $elemMatch . का उपयोग करता हूं इसके लिए और वांछित परिणाम प्राप्त करें।
> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
अब, अगर मैं $और . का उपयोग करता हूं निम्नलिखित क्वेरी में ऑपरेटर की तरह, परिणाम सही नहीं हैं। जैसा कि आप देख सकते हैं एक अतिरिक्त दस्तावेज़ चुना गया है। क्वेरी एम्बेडेड-दस्तावेज़ फ़ील्ड के साथ काम करती है a="a1" या b="b1" .
> db.arrays.find({$and: [ { "arr.a": "a1" }, { "arr.b": "b1" } ] } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 4, "arr" : [ { "a" : "a1", "b" : "b91" }, { "a" : "a29", "b" : "b1" } ] }
तो, $and . का उपयोग करके ऑपरेटर इस उद्देश्य के लिए अभिप्रेत नहीं है (यानी, उप-दस्तावेजों की एक सरणी के कई क्षेत्रों पर क्वेरी करना)।
साथ ही, किसी सरणी एम्बेडेड-दस्तावेज़ फ़ील्ड पर क्वेरी करने के लिए (केवल एक फ़ील्ड ) $elemMatch आवश्यक नहीं है, उदाहरण के लिए:
> db.arrays.find( { "arr.a": "a2" } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 2, "arr" : [ { "a" : "a1", "b" : "b11" }, { "a" : "a2", "b" : "b22" } ] }
{ "_id" : 3, "arr" : [ { "a" : "a2", "b" : "b1" }, { "a" : "a", "b" : "b1" } ] }