部分索引和稀疏索引在 MongoDB 中有什么区别?

16
我已经阅读了 MongoDB 的官方文档,但是真的不理解 sparse 索引和 partial 索引之间的区别。我想要一个带有示例的解释性观点。

2
这里解释了:与稀疏索引的比较 - felix
1个回答

67

稀疏索引是一种优化的索引,它仅包含指向在索引字段中具有值的文档的指针。 例如,假设您想在姓氏字段上添加索引。

{ _id: 1, firstname: 'John', lastname: 'Black', age: 20 }
{ _id: 2, firstname: 'Stive', lastname: 'White', age: 17 }
{ _id: 3, firstname: 'Tom', age: 22 }

如果你运行

db.users.createIndex({ lastname: 1 });

执行该命令,将在三个文档上添加索引,但您不需要对没有姓氏值的文档(_id: 3)建立索引;这是一种浪费空间和内存的做法。 为避免对空字段建立索引,mongodb 提供了 sparse 索引,它只需“检查非空值”即可。 因此,在添加 sparse: true 后。

db.users.createIndex({ lastname: 1, sparse: true });

Mongodb仅为2个文档(_id:1, _id:2)添加索引。这很好,但是如果您想仅对那些年龄大于18岁的用户文档进行索引,该怎么办呢?

您无法使用稀疏索引,因为它仅检查值存在的文档。

这就是为什么创建了部分索引

db.person.createIndex( 
  { age: 1}, 
  { partialFilterExpression: { age: { $gte: 18 }, lastname: { $exists: true }}
);

这个示例只会为1个文档(ID:1)设置索引。部分索引是稀疏版本的复杂形式,它不仅检查文档是否存在,而且使用partialFilterExpression字段中提供的条件来过滤文档。


1
一个非常好的解决方案,实际上是我一直在寻找的非常干净和简单的解决方案。谢谢!!!如果您觉得这个问题有用/有趣,请标记或收藏它。 - Amulya Kashyap
1
非常简洁明了的解释!谢谢! - keshav.bahadoor
2
为了完整起见,如果您想将{lastname:1, sparse:true}索引实现为部分索引,则应该是:{{lastname:1},partialFilterExpression:{lastname:{$exists:true}}} - Jason Masters
1
默认情况下,索引稀疏中不应存储文档。如果要索引的文档没有字段,那么它的存在意义何在?无论如何都无法查找该文档,为什么要将其包含在索引中呢? - milanHrabos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接