我有一个布尔标志:finished
。我是不是该
A: index({ finished: 1 })
B: index({ finished: 1 }, {sparse: true})
C: use flag :unfinished instead, to query by that
D: other?
Ruby mongoid 语法。我的大多数记录都会有标记finished=true,显然大多数操作都会获取那些未完成的。我不确定我是否了解何时使用稀疏以及何时不使用。谢谢!
稀疏的标志有点奇怪。要了解何时使用它,您必须首先了解为什么“稀疏”存在。
当您在一个字段上创建简单索引时,每个文档都有一个条目,即使是没有该字段的文档。
例如,如果您有一个索引 on {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 可用作队列,这里有两个 示例。
但是,如果您查看队列,他们并没有按照您的方式进行操作。我个人将 MongoDB 用作某些生产系统的队列,它运行得很好,但是测试您的预期负载,因为专用队列会执行得更好。
稀疏仅在值为 时才有用null
,而不是false
。当您说“大多数都将完成=真”时,我猜大多数finished
是非的null
,这使得稀疏不是很有用。
而且由于大多数值都是单个值,如果您的查询足够具体,我怀疑任何类型的索引都会有所帮助。