我刚刚开始使用MongoDB并尝试了解索引的工作原理。我有一个集合中的项目列表。每个项目都有一个增加的版本。然后,删除所有先前版本(小于当前版本)(记录未更新,以便两个版本可用一段时间)。商品ID和版本有复合索引。对于删除,是否使用$ ne与$ lt?
有所不同(在性能方面)我会假设不,但我只想确认。
答案 0 :(得分:4)
在不知道实施细节的情况下$lt
可能比$ne
更有效。在B树索引上$ne
将是两个范围扫描($lt
和$gt
),而$lt
只是一个。
但在你的情况下$lt
似乎是你想要的(找到旧版本)。如果您使用了$ne
,则可能会意外删除您认为不存在的较新的版本,但实际上可能是在平均时间内创建的。请记住,MongoDB不支持跨文档的事务或一致视图。并发更新可能会在这里咬你。
答案 1 :(得分:1)
实际上,存在巨大差异。 "$ne and $nin operators are not selective",这意味着索引根本不会加速查询的那一部分。因此,如果使用$ ne,那么MongoDB将不会使用复合索引的版本部分。