(非索引字段)中的MongoDb $ set运算符是否昂贵?

时间:2016-06-12 14:18:23

标签: mongodb indexing mongoose

我有一个拥有多个索引的集合,而且我经常需要将一些数据推送到该集合的数组中。我试图通过MongoDb Doc,但我能得到的最好的是,

  

对于未索引字段的插入和更新,稀疏索引的开销小于非稀疏索引的开销。此外,对于非稀疏索引,不更改记录大小的更新具有较少的索引开销。

我知道稀疏索引和非稀疏索引的区别,稀疏索引的开销会更少。

但是为什么即使我只更新文档中的非索引字段,为什么所有其他索引都必须更新!是因为每个索引都有相同的数据,所有数据都必须更新吗?

我的文件

var sample = new Schema({
   ***
   student_list: [ {type :Schema.Types.Mixed}],
   location:  [ {type :Schema.Types.Mixed}],
   ****
});
student_list.studID will be indexed

{studID:1,city:M,Time:"... e}

现在我经常需要更新位置字段。查询

db.sample.find({student_list.studID:"studid"})
db.sample.find({student_list.studID:"studid", student_list.city:"M"})
all using student_list_studId_1 index

这种方法是否正常,或者我应该创建一个差异集合,并将每个学生列表作为单独的文档,(每个示例文档都有多个学生ID,这可能在diff示例文档中很常见)

1 个答案:

答案 0 :(得分:0)

为每个插入更新索引的原因与文档大小及其分配有关。

假设文档有1765个字节,我们正在添加下一个950字节(数据+ bson开销),它可以执行给定文档的重定位,因为它不适合当前分配的数据块 - >和db引擎需要更新所有索引中的指针以指向新的文档位置。