मैं इसे एक उदाहरण के साथ समझाऊंगा। संग्रह पर विचार करें 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" } ] }