यह व्यवहार मोंगो प्रलेखन में अपेक्षित और समझाया गया है यहां ।
ऐसा लगता है कि जब सरणी तत्वों का एक संयोजन स्वतंत्र रूप से सभी स्थितियों से मेल खाता है, तो मोंगो परिणाम वापस देकर "स्मग" खेलने के लिए तैयार होता है।
हमारे उदाहरण में, 5 $lt:20 शर्त से मेल खाता है और 25 $gt:10 शर्त से मेल खाता है। तो, यह एक मैच है।
निम्नलिखित दोनों [5,25] परिणाम लौटाएंगे:
db.collection.find({ x: {$gt: 10, $lt: 20} })
db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
यदि यह उपयोगकर्ता अपेक्षित व्यवहार है, तो राय भिन्न हो सकती है। लेकिन यह निश्चित रूप से प्रलेखित है, और इसकी अपेक्षा की जानी चाहिए।
संपादित करें , नील के दुखद अभी तक अत्यधिक शैक्षिक संपादन के लिए मूल उत्तर के लिए, समाधान के लिए पूछना:
$elemMatch का उपयोग केवल सरणियों . के लिए "सख्त" तत्व तुलना कर सकते हैं .
db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } })
नोट :यह x:[11,12] और . दोनों से मेल खाएगा x:[11,25]
मेरा मानना है कि जब इस तरह की एक क्वेरी की आवश्यकता होती है, तो दो . पर एक संयोजन प्रश्नों की आवश्यकता है, और परिणाम संयुक्त। नीचे एक क्वेरी है जो x वाले दस्तावेज़ों के लिए सही परिणाम देता है एक सरणी नहीं :
db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )
लेकिन सबसे अच्छा तरीका इस मामले में x के प्रकार को हमेशा . में बदलना है एक सरणी बनें, भले ही इसमें केवल एक तत्व हो। फिर, अपेक्षित व्यवहार के साथ सही परिणाम प्राप्त करने के लिए केवल $elemMatch क्वेरी की आवश्यकता होती है।