我想从MongoDB集合中返回所有ID,并使用下面的代码:
db.coll.find({}, { _id: 1})
但是MongoDB会扫描整个集合,而不是从默认的index { _id: 1 }
中读取信息。
来自日志:
{ find: "collection", filter: {}, projection: { _id: 1 } }
planSummary: COLLSCAN cursorid:30463374118 keysExamined:0
docsExamined:544783 numYields:4286 nreturned:544782 reslen:16777238
locks:{ Global: { acquireCount: { r: 8574 } }, Database: {
acquireCount: { r: 4287 } }, Collection: { acquireCount: { r: 4287 } }
} protocol:op_query 7024ms
请知道如何解决这个问题?
答案 0 :(得分:2)
您需要添加一个可以使用此索引的过滤器,以便更改该查询计划 - 并非所有操作都会删除FETCH阶段,例如: $ exists似乎不起作用:
db.coll.find({ _id: { $ne: 0 }, { _id: 1 }) // works for ObjectIds
对此的解释的一部分在documentation:
覆盖查询是一个完全可以使用的查询 索引,而不必检查任何文件。索引涵盖了一个 当以下两种情况都适用时查询:
- 查询中的所有字段都是索引的一部分,
- 并且结果中返回的所有字段都在同一索引中。
我似乎记得在没有过滤器的情况下看到JIRA请求支持,但不记得是哪个票...
答案 1 :(得分:2)
我找到了一个解决方案,如果知道_id
字段的类型,它就有效。如果是字符串_id
:
db.coll.find({ _id: { $regex: ".*" }, { _id: 1 })
如果是整数_id
:
db.coll.find({ _id: { $gte: 0 }, { _id: 1 })