MongoDB查询具有不存在的字段和索引的记录

Nig*_*olf 4 indexing mongodb

我们有一个包含大约1M文档的mongo数据库,我们希望使用已处理的字段轮询此数据库以查找我们之前未见过的文档.为此,我们设置了一个名为的新字段_processed.

要查询需要处理的文档,我们查询没有此处理字段的文档:

db.stocktwits.find({ "_processed" : { "$exists" : false } })
Run Code Online (Sandbox Code Playgroud)

但是,此查询每次完成大约需要30秒,这相当慢.有一个索引(asc)位于_processed字段:

db.stocktwits.ensureIndex({ "_processed" : -1 },{ "name" : "idx_processed" });
Run Code Online (Sandbox Code Playgroud)

添加此索引不会更改查询性能.集合上还有一些其他索引(即ID idx和每个文档中几个字段的唯一索引).

_processed字段很长,也许这应该改为bool以使事情更快?

我们尝试过使用$ where查询(即$where : this._processed==null)做同样的事情,$exists : false性能大致相同(几秒慢,这是有道理的)......

关于什么会缓慢性能缓慢(或者是正常的)的任何想法?有没有人对如何提高查询速度有任何建议?

干杯!

joo*_*ies 5

升级到2.0将为您执行此操作:

来自MongoDB.org:

在v2.0之前,$ exists无法使用索引.仍然使用其他字段的索引.

  • 同上,不知道这一点(认为这是一个重要的教训,在这些RTFM再次密切关注的时候).谢谢,解决了我的问题.只需将查询更改为{'_processed':null}即可.天才DV87! (2认同)