Điều đó thật buồn cười, tôi không thể quyết định nói rằng đó là lỗi hay không, điều đó phụ thuộc vào bạn:
Có hai cú pháp khả dụng: http://docs.mongodb.org/manual/ tham chiếu / toán tử / truy vấn /
Khi bạn sử dụng:
db.collection.find( { age : 25 } )
cũng sẽ
db.collection.find( { age : 25 } ).explain()
db.collection.find( { age : 25 } ).hint(someindex)
làm việc tốt.
Khi bạn sử dụng giải pháp của mình (cú pháp khác):
db.collection.find( { $query: { age : 25 } } )
đầu ra của
db.sampleCollection.find({$query:{"stringField":"Random string0"}}).explain()
Sẽ hiển thị giống như truy vấn không sử dụng chỉ mục
nếu bạn cũng sử dụng .hint cho chỉ mục, nó sẽ bỏ qua kết quả. :) (Đó là tôi không thực sự hiểu)
May mắn thay, có một cú pháp khác cho các thao tác này:bạn có thể sử dụng:
db.sampleCollection.find({$query:{"stringField":"Random string0"}, $explain:1})
nó sẽ có đầu ra phù hợp và hiển thị cho tôi cách sử dụng chỉ mục. Cũng có cú pháp tương tự cho $ gợi ý.
Bạn có thể kiểm tra tài liệu tại đây: http://docs.mongodb.org / manual / reference / meta-query-operator /
Tôi thấy điều này thực sự thú vị nên tôi đã bật hồ sơ:
tôi đã thực hiện một bộ sưu tập thử nghiệm (queryTst) với khoảng 250 nghìn tài liệu, mỗi tài liệu chỉ có _id và một trường tuổi trong cấu trúc có chỉ mục về độ tuổi.
Đối với truy vấn này:
db.queryTst.find({$query:{"age":16},$explain:1})
tôi đã nhận:
{
"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" : ""
}
cho điều này:
db.queryTst.find({$query:{"age":16},$explain:1}).explain()
tôi đã nhận:
"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" : {
},
trong nhật ký trình biên dịch:cho lần đầu tiên
{
"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" : ""
}
cho thứ hai:
{
"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" : ""
}
điều này có nghĩa là theo tôi đó là giải thích () gây ra việc quét bảng theo cú pháp hỗn hợp.