Mongodb 用于字段更新/插入的Mongo索引

Mongodb 用于字段更新/插入的Mongo索引,mongodb,Mongodb,我正在尝试为集合中的所有文档插入一个新字段。 我在“用户id”字段上有一个升序索引 a) 为了从索引中获益,要更新/插入的字段是否应该包含/转换为索引? b) 另外,如果我不做任何范围操作,哈希索引在这种情况下是否更有效 db.collA.update( { user_id: 123 } , { $set : { newfield : "something" } } , { multi:true} ) 回答你问题的A部分: 不

我正在尝试为集合中的所有文档插入一个新字段。 我在“用户id”字段上有一个升序索引

a) 为了从索引中获益,要更新/插入的字段是否应该包含/转换为索引? b) 另外,如果我不做任何范围操作,哈希索引在这种情况下是否更有效

db.collA.update(  { user_id: 123 }
                , { $set : { newfield : "something" } }
                , { multi:true} ) 

回答你问题的A部分: 不会。插入或更新现有文档的索引属性实际上可能会导致索引的性能问题。如果您要在大批量中执行此操作,您可能应该在操作后重新索引或修复

B部分:
不需要。标准索引类型很好地涵盖了这个用例。如果一个“UsRyID”真正标识了一个文档,你可以考虑将它作为文档的“ID”,然而,这是一个稍微先进的设计决定,并附带了对集合的影响(正反两方面)。.

除非您只希望更新索引,而不希望更新实际的磁盘文档,否则将更新后的字段放入索引是没有用的。至于散列索引,我看不出它们在这里有什么帮助,即使您使用了散列索引,MongoDB仍然会执行内部范围查询,以查找通过btree部分的精确值,这些部分的值在这个id的范围内(比如范围1-1000适合您的123),然后会执行一种二进制搜索来查找精确值。使用散列索引可能会将整个索引加载到RAM中,而不是您需要的段。谢谢。我试图把我在mongo索引上读到的随机信息放在一起。你应该回答这个问题,我会接受的。我可能错过了过去几个版本中关于散列索引的一些变化,所以我会看看是否有人有我忽略的地方