我应该在mongodb中使用稀疏索引作为布尔标志吗?

时间:2012-06-20 14:05:51

标签: mongodb indexing mongoid

我有一个布尔标志:finished。我应该

A: index({ finished: 1 })
B: index({ finished: 1 }, {sparse: true})
C: use flag :unfinished instead, to query by that
D: other?

Ruby mongoid语法。我的大多数记录都会有flag finished = true,而且大多数操作显然会取得那些未完成的记录。我不确定我是否理解何时使用稀疏,何时不使用。谢谢!

2 个答案:

答案 0 :(得分:14)

稀疏旗帜有点奇怪。要了解何时使用它,您必须首先理解为什么“稀疏”存在。

在一个字段上创建简单索引时,每个文档都有一个条目,甚至是没有该字段的文档。

例如,如果您在{rarely_set_field : 1}上有索引,则会有一个主要由null填充的索引,因为在大多数情况下该字段不存在。这是浪费空间,搜索效率低下。

{sparse:true}选项将删除null值,因此您获得的索引仅包含定义{rarely_set_field}时的条目。

回到您的案例。

你问的是使用布尔+稀疏。但稀疏并不会真正影响“布尔”,稀疏影响“设置与未设置”。

在您的情况下,您尝试获取unfinished。要利用sparse,键不是布尔值,而是unfinished条目具有该键并且“已完成”条目根本没有键的事实。

{ _id: 1, data: {...}, unfinished: true }
{ _id: 2, data: {...} } // this entry is finished

听起来像是在使用队列

您绝对可以利用上述信息来实现稀疏索引。但是,它实际上听起来像是在使用队列。 MongoDB可作为队列使用,这里是two examples

但是,如果您查看队列,他们就不会按照您的方式进行操作。我个人使用MongoDB作为一些生产系统的队列,它运行得很好,但是测试你的预期负载,因为专用的队列会表现得更好。

答案 1 :(得分:1)

稀疏仅在值为null而非false时才有用。当你说“大部分已经完成=真实”时,我猜测大多数finished都是非null,这使得稀疏不是很有用。

由于大多数值都是单个值,因此如果您的查询足够具体,我怀疑任何类型的索引都会有所帮助。