MongoDB在返回_id时使用COLLSCAN

时间:2018-03-28 12:01:51

标签: mongodb mongodb-indexes

我想从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

请知道如何解决这个问题?

2 个答案:

答案 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 })