我已经阅读了 MongoDB 的官方文档,但是真的不理解 sparse 索引和 partial 索引之间的区别。我想要一个带有示例的解释性观点。
稀疏索引是一种优化的索引,它仅包含指向在索引字段中具有值的文档的指针。 例如,假设您想在姓氏字段上添加索引。
{ _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
字段中提供的条件来过滤文档。
{lastname:1, sparse:true}
索引实现为部分索引,则应该是:{{lastname:1},partialFilterExpression:{lastname:{$exists:true}}}
。 - Jason Masters