所以我有一个空的数据库'tests'和一个名为'test'的集合。 首先,我确保我的索引设置正确。
db.test.ensureIndex({t:1})
db.test.getIndices()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "tests.test"
},
{
"v" : 1,
"key" : {
"t" : 1
},
"name" : "t_1",
"ns" : "tests.test"
}
]
之后我插入了一些测试记录。
db.test.insert({t:1234})
db.test.insert({t:5678})
当我使用以下命令查询数据库并让Mongo解释结果时,我得到以下输出:
db.test.find({t:1234},{_id:0}).explain()
{
"cursor" : "BtreeCursor t_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"t" : [
[
1234,
1234
]
]
},
"server" : "XXXXXX:27017",
"filterSet" : false
}
有人可以向我解释为什么indexOnly是假的吗?
提前致谢。
答案 0 :(得分:2)
要成为covered index query,您只需要检索索引中的那些字段:
> db.test.find({ t: 1234 },{ _id: 0, t: 1}).explain()
{
"cursor" : "BtreeCursor t_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 0,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 0,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : true,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"t" : [
[
1234,
1234
]
]
},
"server" : "ubuntu:27017",
"filterSet" : false
}
基本上这意味着仅索引用于检索数据,而无需返回实际文档并检索更多信息。这可以是您需要的多个字段(在合理范围内),但它们确实需要包含在索引中以及返回的唯一字段中。
答案 1 :(得分:0)
嗯原因尚未明确解释(实际上让我感到困惑)所以这是我的努力。
基本上,为了让MongoDB知道所述索引涵盖了查询,它必须知道你想要的字段。
如果你只是说你不想_id
它怎么知道*
- _id
= t
而不看?
此处*
表示所有字段,就像在SQL中一样。
答案是不可以的。这就是为什么你需要提供完整的字段/选择/投影/它们用于定义的任何单词,以便MongoDB可以知道你的回报符合索引。