虽然我承诺一个外键约束对于NoSql数据库没有意义,但如果它允许我重命名字段,它是否应该确保它更新索引? http://www.mongodb.org/display/DOCS/Updating#Updating-%24rename
{ $rename : { old_field_name : new_field_name } }
但如果我有
db.mycollections.ensureIndex({old_field_name:1});
如果索引自动更新会不会很好?
是不是因为system.indexes只是另一个表而且这样的自动更新意味着排序的外键约束,索引更新没有完成?或者我错过了某些旗帜?
答案 0 :(得分:1)
它没有这样做。
如果索引自动更新,“问题的答案会不会很好?”是,“不,不是真的”。
如果您认为重命名字段是个好主意,您可以同时自己添加新索引。您可能需要在代码中进行许多其他更改以反映字段上的重命名(查询,更新,映射缩减操作,...),那么为什么您认为它应该将索引重新创建为应该发生的事情什么是非常罕见的操作,当你需要手动完成很多中的一件事时?
如果你关心这个功能,去请求它,10Gen对建议非常敏感,但如果答案是“为什么这很重要?”我不会感到惊讶。
答案 1 :(得分:1)
引用Mike O'Brien:
$ rename运算符类似于在单个原子操作中执行$ set / $ unset。对于需要获取值并将其移动到另一个字段的情况,这是一个快捷方式,而无需分两步执行(一个用于获取字段的值,另一个用于设置新值)。
执行$ rename确实意味着数据正在发生变化。如果我使用$ rename将名为“x”的字段重命名为“y”,但文档中已存在名为“y”的字段,则“y”的旧值将被覆盖,字段“x”将不再存在已经存在了。如果索引“x”或“y”,则操作将更新这些索引以反映操作产生的最终值。当使用重命名将字段从嵌入文档中移动到顶层时(例如将“a.b”重命名为“c”)或反之亦然,这同样适用。
在SO问题中建议的行为(即,重命名一个字段维持它被移动到的字段与其在索引中的值之间的关系)然后事情可能变得非常混乱并且难以推断出什么是“正确的” “预期的行为是针对某些行动的。例如,如果我在集合中的字段“A”上创建索引,则在其中一个文档中将“A”重命名为“B”,然后执行以下操作: update({“A”:},{“$ set”:{“B”:}})//找到A =的文档并将其值B设置为 更新({“B”:},{“$ set”:{“A”:}})//找到B =的文档并将其值A设置为
这些应该相同吗? 通常,让数据库按字段名称维护集合中的索引是一种设计决策,可以保持行为的可预测性和简单性。