3

我有一个布尔标志: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,显然大多数操作都会获取那些未完成的。我不确定我是否了解何时使用稀疏以及何时不使用。谢谢!

4

2 回答 2

18

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

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

例如,如果您有一个索引 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 用作某些生产系统的队列,它运行得很好,但是测试您的预期负载,因为专用队列会执行得更好。

于 2012-06-21T05:30:12.173 回答
2

稀疏仅在值为 时才有用null,而不是false。当您说“大多数都将完成=真”时,我猜大多数finished是非的null,这使得稀疏不是很有用。

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

于 2012-06-21T08:01:02.337 回答