यह मजाकिया था मैं यह कहने का फैसला नहीं कर सकता कि यह एक बग है या नहीं यह आप पर निर्भर है:
दो सिंटैक्स उपलब्ध हैं:http://docs.mongodb.org/manual/ संदर्भ/ऑपरेटर/क्वेरी/
जब आप उपयोग कर रहे हों:
db.collection.find( { age : 25 } )
भी होगा
db.collection.find( { age : 25 } ).explain()
db.collection.find( { age : 25 } ).hint(someindex)
ठीक काम करो।
जब आप अपने समाधान (अन्य सिंटैक्स) का उपयोग कर रहे हों:
db.collection.find( { $query: { age : 25 } } )
. का आउटपुट
db.sampleCollection.find({$query:{"stringField":"Random string0"}}).explain()
अनुक्रमणिका का उपयोग नहीं करने वाली क्वेरी की तरह दिखाई देगी
यदि आप सूचकांक के लिए .hint का भी उपयोग करते हैं तो यह परिणाम को छोड़ देगा। :) (यानी मैं वास्तव में समझ नहीं पा रहा हूं)
सौभाग्य से इन ऑपरेशनों के लिए एक और सिंटैक्स भी है:आप इसका उपयोग कर सकते हैं:
db.sampleCollection.find({$query:{"stringField":"Random string0"}, $explain:1})
इसका सही आउटपुट होगा और मेरे लिए इंडेक्स का उपयोग दिखाया जाएगा। साथ ही $hint के लिए समान सिंटैक्स है।
आप दस्तावेज़ यहाँ देख सकते हैं:http://docs.mongodb.org /मैनुअल/संदर्भ/मेटा-क्वेरी-ऑपरेटर/
मुझे यह वास्तव में दिलचस्प लगा इसलिए मैंने प्रोफाइलर चालू कर दिया:
मैंने लगभग 250k दस्तावेज़ों के साथ एक परीक्षण संग्रह (queryTst) बनाया है, जिनमें से प्रत्येक में केवल _id है और उम्र के आधार पर एक इंडेक्स के साथ संरचना में एक आयु फ़ील्ड है।
इस प्रश्न के लिए:
db.queryTst.find({$query:{"age":16},$explain:1})
मुझे मिल गया:
{
"cursor" : "BtreeCursor age_1",
"isMultiKey" : false,
"n" : 2,
"nscannedObjects" : 2,
"nscanned" : 2,
"nscannedObjectsAllPlans" : 2,
"nscannedAllPlans" : 2,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"age" : [
[
16,
16
]
]
},
"allPlans" : [
{
"cursor" : "BtreeCursor age_1",
"n" : 2,
"nscannedObjects" : 2,
"nscanned" : 2,
"indexBounds" : {
"age" : [
[
16,
16
]
]
}
}
],
"oldPlan" : {
"cursor" : "BtreeCursor age_1",
"indexBounds" : {
"age" : [
[
16,
16
]
]
}
},
"server" : ""
}
इसके लिए:
db.queryTst.find({$query:{"age":16},$explain:1}).explain()
मुझे मिल गया:
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 250011,
"nscanned" : 250011,
"nscannedObjectsAllPlans" : 250011,
"nscannedAllPlans" : 250011,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 103,
"indexBounds" : {
},
प्रोफाइलर लॉग में:पहले के लिए
{
"ts" : ISODate("2013-01-30T20:35:40.526Z"),
"op" : "query",
"ns" : "test.queryTst",
"query" : {
"$query" : {
"age" : 16
},
"$explain" : 1
},
"ntoreturn" : 0,
"ntoskip" : 0,
"nscanned" : 2,
"keyUpdates" : 0,
"numYield" : 0,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(368),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(8),
"w" : NumberLong(5)
}
},
"nreturned" : 1,
"responseLength" : 567,
"millis" : 0,
"client" : "127.0.0.1",
"user" : ""
}
दूसरे के लिए:
{
"ts" : ISODate("2013-01-30T20:35:47.715Z"),
"op" : "query",
"ns" : "test.queryTst",
"query" : {
"query" : {
"$query" : {
"age" : 16
},
"$explain" : 1
},
"$explain" : true
},
"ntoreturn" : 0,
"ntoskip" : 0,
"nscanned" : 250011,
"keyUpdates" : 0,
"numYield" : 0,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(104092),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(13),
"w" : NumberLong(5)
}
},
"nreturned" : 1,
"responseLength" : 373,
"millis" : 104,
"client" : "127.0.0.1",
"user" : ""
}
जो किसी भी तरह मेरे लिए इसका मतलब है कि व्याख्या () मिश्रित वाक्यविन्यास में तालिका स्कैन का कारण बनती है।