Mongodb Mongod-IndexOnly为false,即使索引中包含查询和投影

Mongodb Mongod-IndexOnly为false,即使索引中包含查询和投影,mongodb,indexing,Mongodb,Indexing,mongo covered queries文档讨论了查询和投影,如果需要covered queries,只需关闭投影中的_id字段。如果您需要_id字段,但仍然需要覆盖查询的效率(indexOnly=True),该怎么办 当然,如果我关闭投影上的_id,则会以指数方式返回true,并且查询速度非常快。我做错了什么 编辑-我通过消除对空格的大小写不敏感,添加了一个“^”来加快查询速度,提高了效率,但索引为:False。我不明白为什么这不是真的 来自: $regex只能在正则表达式 具有用于字符串开

mongo covered queries文档讨论了查询和投影,如果需要covered queries,只需关闭投影中的_id字段。如果您需要_id字段,但仍然需要覆盖查询的效率(indexOnly=True),该怎么办

当然,如果我关闭投影上的_id,则会以指数方式返回true,并且查询速度非常快。我做错了什么

编辑-我通过消除对空格的大小写不敏感,添加了一个“^”来加快查询速度,提高了效率,但索引为:False。我不明白为什么这不是真的

来自:

$regex只能在正则表达式 具有用于字符串开头(即^)的锚点,并且是 区分大小写匹配。此外,
/^a
/、
/^a.*/
/^a.*$/
匹配等效项 字符串,它们具有不同的性能特征。所有这些表达式都使用 索引(如果存在适当的索引);但是,
/^a.*/
/^a.*$/
速度较慢<代码>/^a/可以 匹配前缀后停止扫描

在本例中,您将regex与
i
一起使用,这意味着不区分大小写的匹配。所以,您应该从regex中删除
i
,并从字段的开头开始搜索


顺便说一句,我不理解您的搜索条件:在不区分大小写的字段中查找一个空格字符?

不太清楚原因,但似乎您的查询使用的是
{field1:1}
索引,而不是
{field1:1,\u id:1}
索引。您可以尝试运行带有提示的查询吗

db.collection.find( { field1: {$regex:/^\s/} }, { field1: 1, _id: 1 } ).hint( { field1: 1, _id: 1 } ).explain()

可能是查询优化器最初选择了{field1:1}索引,并且没有重新评估各种计划。有关查询优化器及其如何选择计划的说明,请参阅。

我不知道为什么会出现不区分大小写的匹配。我只是漫不经心地把它打进去。谢谢你的回复。根据
nscannedObjects
字段,我可以说它使用索引来匹配查询条件。基于
indexOnly:false
,我可以说它不能只使用index返回结果。嗯,需要调查一下为什么。。。
db.collection.find( { field1: {$regex:/^\s/} }, { field1: 1, _id: 1 } ).hint( { field1: 1, _id: 1 } ).explain()