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

oma*_*oma 3 indexing mongodb mongoid

我有一个布尔标志:finished.我是不是该

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

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

Gat*_* VP 15

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

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

例如,如果您有一个索引{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
Run Code Online (Sandbox Code Playgroud)

听起来你正在使用队列

您绝对可以利用上述信息来实现稀疏索引.但是,它实际上听起来像是在使用队列.MongoDB可以作为队列使用,这里有两个 例子.

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