部分索引与稀疏索引mongodb有什么区别?

Amu*_*yap 6 mongoose mongodb

我已经阅读了MongoDB的官方文档,但实际上无法理解稀疏索引和部分索引之间的区别.希望得到一个带有例子的解释性视图.提前致谢!!!!

sty*_*dev 27

稀疏索引是一个优化索引,它只包含指向索引字段中具有值的文档的指针.例如,假设您要在lastname字段上添加索引

{ _id: 1, firstname: 'John', lastname: 'Black', age: 20 }
{ _id: 2, firstname: 'Stive', lastname: 'White', age: 17 }
{ _id: 3, firstname: 'Tom', age: 22 }
Run Code Online (Sandbox Code Playgroud)

如果你跑

db.users.createIndex({ lastname: 1 });
Run Code Online (Sandbox Code Playgroud)

命令,它将在3个文档上添加索引,但是您不需要在文档上有索引,其中没有lastname值(_id:3); 这是浪费空间和记忆.为了避免空字段的索引,mongodb有sparse索引,这只是"检查非空值".所以当你添加sparse: true

db.users.createIndex({ lastname: 1, sparse: true });
Run Code Online (Sandbox Code Playgroud)

Mongodb将仅为2个文档添加索引(_id:1,_id:2).它很棒,但如果您只想索引那些超过18年的用户文档呢?您不能使用稀疏索引,因为它只检查文档的值是否存在.

这就是partial indexes创建的原因.

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

此示例仅为1个文档(id:1)放置索引.部分索引是稀疏的复杂版本,它将过滤文档,不仅检查它们的存在,还使用partialFilterExpression字段中提供的条件.

  • 为了完整起见,如果您想将“{lastname:1,sparse:true}”索引实现为部分索引,则应为:“{{lastname:1},partialFilterExpression:{lastname:{$exists:”正确}}}` (2认同)