आपके द्वारा लिंक किए गए दस्तावेज़ में कमांड को कुछ पंक्तियों में नोट करें:
यह आपको बता रहा है कि गैर-मौजूद फ़ील्ड और शून्य पर सेट फ़ील्ड को विशेष रूप से माना जाता है।
दस्तावेज़ों के लिए {}
और {a: null}
सॉर्ट क्रम में समतुल्य होने के लिए, सॉर्ट एल्गोरिथम को अनुपलब्ध सॉर्ट फ़ील्ड को मौजूद होने पर विचार करना चाहिए, और उसका मान null
होना चाहिए ।
यदि आप स्पष्ट रूप से अनुपलब्ध फ़ील्ड जोड़ते हैं, तो यह देखने के लिए कि यह कैसा दिखता है, क्रम अधिक समझ में आता है।
फ़िल्टर {tag: { $gte: { baz: MinKey() }}}
{_id: 1, tag: {bar: "BAR"}}
. पर लागू किया गया अनिवार्य रूप से तुलना कर रहा है {baz: MinKey()}
{baz: null, bar: "BAR"}
. के साथ ।
आपके द्वारा लिंक किए गए दस्तावेज़ के शीर्ष के पास यह बताता है कि MinKey
null
. से कम है , इसलिए यह उचित क्रम है।
संपादित करें
सामान्य तौर पर, क्वेरी करना सबसे अधिक कुशल होता है जब फ़ील्डनाम स्वयं डेटा नहीं होते हैं। एक सारणीबद्ध डेटाबेस के संदर्भ में, किस कॉलम में "baz" होगा?
स्कीमा में थोड़ा सा परिवर्तन इस प्रकार की क्वेरी को सरल बना देगा। {tagname: tagvalue}
. के बजाय , {k:tagname, v:tagvalue}
. का उपयोग करें . फिर आप tag.k
. को इंडेक्स कर सकते हैं और/या tag.v
, और tag.k
. पर क्वेरी करें "baz" टैग वाले सभी दस्तावेज़ों को खोजने के लिए, असमानता संचालन वाले टैग को क्वेरी करना अधिक सहजता से काम करेगा।
db.collection.find({"tag.k":{$gte:"baz"}})
elemMatch जैसे
. के साथ सटीक मिलान किया जा सकता हैdb.collection.find({tag: {$elemMatch:{k:"baz",v:"BAZ"}}})
यदि आपको वास्तव में {tagname: tagvalue}
. को शामिल करने के लिए लौटाए गए दस्तावेज़ों की आवश्यकता है , $arrayToObject
एग्रीगेशन ऑपरेटर ऐसा कर सकता है:
db.collection.aggregate([
{$match: {
"tag.k": {$gte: "baz"}
}},
{
$addFields: {
tag: {$arrayToObject: [["$tag"]]}
}}
])