从版本 2.6 开始,MongoDB 尽可能保留字段的顺序。但是,_id
字段始终排在第一位,重命名字段可能会导致重新排序。但是,我通常会尽量不要依赖这样的细节。正如最初的问题所提到的,还有额外的层需要考虑,每个层都必须为订单的稳定性提供某种保证......
原答案:
不,MongoDB不保证字段的顺序:
“无法保证更新后的现场顺序将保持一致或相同。”
特别是,改变文档大小的就地更新通常会改变字段的顺序。例如,如果您$set
的字段的旧值为 number 类型而新值为NumberLong
,则字段通常会重新排序。
但是,数组保留正确的顺序:
[ {'key1' : 'value1'}, {'key2' : 'value2'}, ... ]
我根本不明白为什么这是“丑陋”和“臃肿”。存储复杂对象的列表再简单不过了。但是,将对象滥用为列表绝对是丑陋的:对象具有关联数组语义(即,给定名称只能有一个字段),而列表/数组则没有:
// not ok:
db.foo2.insert({"foo" : "bar", "foo" : "lala" });
db.foo2.find();
{ "_id" : ObjectId("4ef09cd9b37bc3cdb0e7fb26"), "foo" : "lala" }
// a list can do that
db.foo2.insert({ 'array' : [ {'foo' : 'bar'}, { 'foo' : 'lala' } ]});
db.foo2.find();
{ "_id" : ObjectId("4ef09e01b37bc3cdb0e7fb27"), "array" :
[ { "foo" : "bar" }, { "foo" : "lala" } ] }
请记住,MongoDB 是一个对象数据库,而不是键/值存储。