यह वास्तव में भ्रमित करने वाला विषय है। मैं 10gen पर काम करता हूं और मुझे इसके चारों ओर अपना सिर लपेटकर कुछ समय बिताना पड़ा;)
आइए देखें कि क्वेरी इंजन इस क्वेरी को कैसे संसाधित करता है।
यहाँ फिर से प्रश्न है:
> db.test.find({ b : { $gt : 4, $lt : 6}});
जब यह रिकॉर्ड तक पहुंच जाता है तो ऐसा लगता है कि इसे मेल नहीं खाना चाहिए...
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 4, 6, 8 ] }
मिलान सरणी के प्रत्येक तत्व के विरुद्ध नहीं किया जाता है, बल्कि संपूर्ण रूप से सरणी के विरुद्ध किया जाता है।
तुलना तीन चरणों में की जाती है:
चरण 1 :सभी दस्तावेज़ खोजें जहाँ b का मान 4 से अधिक है
b:[2,4,6,8] मेल खाता है क्योंकि 6 और 8, 4 से बड़े हैं
चरण 2 :सभी दस्तावेज़ खोजें जहाँ b का मान 6 से कम है
b:[2,4,6,8] मेल खाता है क्योंकि 2 और 4 6 से कम हैं
चरण 3 :चरण 1 और 2 दोनों में मेल खाने वाले दस्तावेज़ों का समूह खोजें।
बी:[2,4,6,8] के साथ दस्तावेज़ दोनों चरण 1 और 2 से मेल खाता है इसलिए इसे एक मैच के रूप में वापस कर दिया जाता है। ध्यान दें कि इस चरण में परिणाम भी डी-डुप्लिकेट हैं, इसलिए एक ही दस्तावेज़ को दो बार वापस नहीं किया जाएगा।
यदि आप चाहते हैं कि आपकी क्वेरी पूरी तरह से सरणी के बजाय सरणी के अलग-अलग तत्वों पर लागू हो, तो आप $elemMatch ऑपरेटर का उपयोग कर सकते हैं। उदाहरण के लिए
> db.temp.find({b: {$elemMatch: {$gt: 4, $lt: 5}}})
> db.temp.find({b: {$elemMatch: {$gte: 4, $lt: 5}}})
{ "_id" : ObjectId("4d558b6f4f0b1e2141b66660"), "b" : [ 2, 3, 4, 5, 6 ] }