MongoDB:$not的行为和索引

MongoDB:$not的行为和索引,mongodb,operators,indexing,Mongodb,Operators,Indexing,我认为在MongoDB中添加索引不会影响查询结果。然而,我遇到过一个这样的情况 有一个名为scores的集合。如果没有索引,则执行以下查询: db.scores.find({score: {$not: {$gt: 100}}}) 返回score值不大于100的记录和缺少键score的记录 但是,在score字段中添加索引会导致MongoDB排除缺少键score的记录。有没有办法防止这种情况?请注意,索引在我们的例子中是必不可少的。当MongoDB使用索引时,它只在索引中查找结果。不幸的是,它的

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

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

db.scores.find({score: {$not: {$gt: 100}}})
返回
score
值不大于100的记录和缺少键
score
的记录


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

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

虽然有几种处理方法,但您可以这样做:

db.scores.find({ $or : [ 
                    {score: { $exists: false  }}, 
                    {score: {$not: {$gt: 100}}}]})
这将只检查任一条件是否为
true
。如果检查
explain
的结果,您将看到它对这两种情况都使用索引


尽管如此,如果您只需将
分数添加到所有文档中,它的性能可能会更好,因为索引的使用效率会更高。

您将哪些选项传递给
ensureIndex
?我正在做:
db.scores.ensureIndex({score:1})
这提供了完美的结果。但是,在查询上运行
explain
,它显示正在扫描所有文档,除了一个没有分数的文档。有什么解决方法吗?它正在使用索引,但是
$exists:false
需要进行大量扫描。我建议在所有文档中添加
score:0
,对于您感兴趣的查询类型来说,效率要高得多。