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

(非索引字段)中的MongoDb$set运算符是否昂贵?,mongodb,indexing,mongoose,Mongodb,Indexing,Mongoose,我有一个具有多个索引的集合,通常我必须将一些数据推送到该集合的数组中。我试着通过MongoDb Doc,但我能得到的最好结果是 对于未索引字段的插入和更新,稀疏索引的开销小于非稀疏索引的开销。同样,对于非稀疏索引,不更改记录大小的更新具有更少的索引开销 我知道稀疏索引和非稀疏索引的区别,稀疏索引的开销将更少,这是有意义的 但为什么即使我只更新文档中的一个未编制索引的字段,也要更新所有其他索引!是因为每个索引都有相同的数据,所有数据都必须更新吗? 我的文件 var sample = new Sch

我有一个具有多个索引的集合,通常我必须将一些数据推送到该集合的数组中。我试着通过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,这在差异样本文档中可能很常见)

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


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

什么版本的mongo?你使用什么类型的存储引擎?MLab免费计划nowSandbox使用mongo 3.0.xOhh现在我明白了,谢谢!那么,在我的情况下,哪种方法更明智呢?具有嵌入文档或单独的集合,其中将参考主样本文档