更新后MongoDB字段顺序和文档位置更改

tec*_*ert 20 mongodb

我正在学习MongoDB,我注意到每当我对文档进行更新时,正在更新的字段被推送到订单的末尾,所以如果我有类似的东西:

db.collection.save({field1: value1, field2: value2, ..., field 10: value10});
db.collection.update({field1: value1}, {$set: {field2: new_value}});
Run Code Online (Sandbox Code Playgroud)

如果你这样做:

db.collection.find();
Run Code Online (Sandbox Code Playgroud)

它会显示:

{ "field1":"value1", ..., "field10":"value10", "field2":"new_value"}
Run Code Online (Sandbox Code Playgroud)

您可以看到字段顺序如何更改将更新字段推送到文档末尾的位置.此外,文档本身也被推到了collectoin的末尾.我知道它是一个"无架构"的数据库,它可能不是一个大问题,但它看起来并不"漂亮":).有没有办法在不更改订单的情况下进行就地更新?

Ber*_*ett 21

MongoDB根据特定的填充因子为新文档分配空间.如果您的更新增加了文档的大小超出最初分配的大小,则文档将移动到集合的末尾.相同的概念适用于文档中的字段.

  • 伯尼,谢谢!我理解原因,但不是解决方案.如果它们MongoDB必须重新编写整个文档以满足新的空间要求,为什么它们不能保留过程中的字段/文档顺序?是否有性能损失,或者这是他们还没有时间实施的东西?- 只是好奇. (12认同)

hel*_*lmy 11

仅供参考,MongoDB 2.6更新将保留字段顺序,但以下情况除外:

  1. _id字段始终是文档中的第一个字段.
  2. 包括重命名字段名称的更新可能导致重新排序文档中的字段.


Ram*_*man 6

基于JSON原则的MongoDB中的文档结构和集合结构.JSON是一键/值对(特别是用于文档的fieldName/fieldValue和用于集合的索引/文档).从这个角度来看,你似乎根本不能依赖订单.

  • MongoDB依赖于bson,而不是订购json和bson元素:https://en.wikipedia.org/wiki/BSON (7认同)