且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-11-10 16:29:40

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

The sparse flag is a little weird. To understand when to use it, you have to understand why "sparse" exists in the first place.

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

When you create a simple index on one field, there is an entry for each document, even documents that don't have that field.

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

For example, if you have an index on {rarely_set_field : 1}, you will have an index that is filled mostly with null because that field doesn't exist in most cases. This is a waste of space and it's inefficient to search.

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

The {sparse:true} option will get rid of the null values, so you get an index that only contain entries when {rarely_set_field} is defined.

回到你的情况。

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

You are asking about using a boolean + sparse. But sparse doesn't really affect "boolean", sparse affect "is set vs. is not set".

在您的情况下,您尝试获取未完成。要利用稀疏,键不是布尔值,但未完成条目具有该键并且已完成 条目根本没有密钥。

In your case, you are trying to fetch unfinished. To leverage sparse the key is not the boolean value, but the fact that unfinished entries have that key and that "finished" entries have no key at all.

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

听起来像是在使用队列

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

You can definitely leverage the information above to implement a sparse index. However, it actually sounds like you are using a Queue. MongoDB is serviceable as a Queue, here are two examples.

但是,如果你看一下队列,他们就不会像你那样做了。我个人使用MongoDB作为一些生产系统的队列,它运行得很好,但是测试你的预期负载,因为专用的队列会表现得更好。

However, if you look at the Queue, they are not doing it the way you are doing it. I'm personally using MongoDB as a Queue for some production systems and it runs pretty well, but test your expected load as a dedicated Queue will perform much better.