MongoDB:$ not和索引的行为

时间:2013-10-23 15:15:43

标签: mongodb operators indexing

我认为在MongoDB中添加索引不会影响查询结果。但是我遇到了一个这样的情况。

有一个名为scores的集合。如果没有索引,则会出现以下查询:

db.scores.find({score: {$not: {$gt: 100}}})

返回score的值不大于100的记录以及缺少键score的记录。

score字段上添加索引会导致MongoDB排除缺少密钥score的记录。有办法防止这种情况吗?请注意,索引在我们的案例中是必不可少的。

1 个答案:

答案 0 :(得分:0)

当MongoDB使用索引时,它只在索引中查找结果。不幸的是,它的行为有所不同,这取决于它是完成了一次完整的表扫描还是仅仅是索引。

虽然有几种方法可以解决这个问题,但您可以这样做:

db.scores.find({ $or : [ 
                    {score: { $exists: false  }}, 
                    {score: {$not: {$gt: 100}}}]})

这只会检查两个条件是true。如果您检查explain的结果,您会看到它使用两个条件的索引。

虽然,如果您可以将score添加到所有文档中,它可能会表现得更好,因为索引使用效率会更高。