【问题标题】:MongoDB: behavior of $not and indexingMongoDB:$not 和索引的行为
【发布时间】:2013-10-23 15:15:43
【问题描述】:

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

有一个名为scores 的集合。在没有索引的情况下,以下查询:

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

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

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

【问题讨论】:

  • 你将哪些选项传递给ensureIndex
  • 我在做:db.scores.ensureIndex( { score: 1 })

标签: mongodb operators indexing


【解决方案1】:

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

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

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

这只会检查任一条件是否为true。如果您检查explain 的结果,您会发现它对这两个条件都使用了索引。

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

【讨论】:

  • 这是完美的结果。但是在查询上运行explain,它表明正在扫描所有文档,除了一个没有分数的文档。有什么解决办法吗?
  • 它正在使用索引,但$exists:false 需要进行大量扫描。我建议在所有文档中添加 score: 0 对于您感兴趣的查询类型会更有效。
猜你喜欢
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2017-02-07
  • 2018-06-12
  • 1970-01-01
  • 2015-02-01
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多