我创建了以下1000个文档:
for(i=0;i<1000;i++){db.doc.insert({"doc":{"k1":"v_"+i,"k2":i},"scal":i})}
所以文档看起来像这样:
var d1 = db.doc.findOne()
{
"_id" : ObjectId("5ce25f8920b0be2428648e38"),
"doc" : {
"k1" : "v_0",
"k2" : 0
},
"scal" : 0
}
我创建了以下两个索引:
db.doc.createIndex({"doc":1})
db.doc.createIndex({"scal":1})
我想知道为什么不覆盖以下查询:
db.doc.explain(true).find({doc:{$gt:d1.doc}},{_id:0,doc:1})
{
...
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 999,
"executionTimeMillis" : 1,
"totalKeysExamined" : 999,
"totalDocsExamined" : 999,
...
}
但是,涵盖了使用标量而不是文档的相同查询:
db.doc.explain(true).find({scal:{$gt:d1.scal}},{_id:0,scal:1})
{
...
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 999,
"executionTimeMillis" : 0,
"totalKeysExamined" : 999,
"totalDocsExamined" : 0,
...
}
当我不使用范围运算符时,我只会得到文档中涉及的查询:
db.doc.explain(true).find({doc:d1.doc},{_id:0,doc:1})
{
...
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 0,
"totalKeysExamined" : 1,
"totalDocsExamined" : 0,
...
}
即使$in
也会导致覆盖查询:
var dis = db.doc.distinct("doc")
db.doc.explain(true).find({doc:{$in:dis}},{_id:0,doc:1})
{
...
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1000,
"executionTimeMillis" : 8,
"totalKeysExamined" : 1000,
"totalDocsExamined" : 0,
...
}
但是,当应用于文档时,诸如$gt
之类的范围运算符似乎无法导致覆盖查询。这是在任何地方记录的预期行为,还是错误?
我正在使用在mongodb v3.6 Linux 64位上运行的replSet。