我正在考虑使用MongoDB来存储包含键/值对列表的文档。安全但丑陋且肿的存储方式如下
[ ['k1' : 'v1'] , ['k2' : 'v2'], ...]
但是文档元素固有地在底层BSON数据结构中排序,因此原则上:
{k1 : 'v1', k2 : 'v2', ...}
应该足够了。但是,我希望大多数语言绑定都将它们解释为关联数组,因此可能会扰乱顺序。所以我需要知道的是:
我在这里对Javascript和PHP最为感兴趣,但我也想了解其他语言。感谢您的任何帮助,或者只是指向一些我可以使用RTM的文档的链接。
从2.6版开始,MongoDB会尽可能保留字段顺序。但是,该_id字段始终排在第一位,重命名字段可能导致重新排序。但是,我通常会尽量不要依赖此类细节。正如原始问题所提到的那样,还需要考虑其他一些层,每个层都必须为订单的稳定性提供某种保证…
_id
原始答案:
不,MongoDB 不保证字段的顺序:
“不能保证更新后的现场订单会保持一致或相同。”
特别是,更改文档大小的就地更新通常会更改字段的顺序。例如,如果您的$set一个字段的旧值是数字类型,而新值是NumberLong,则字段通常会重新排序。
$set
NumberLong
但是,数组可以正确保留顺序:
[ {'key1' : 'value1'}, {'key2' : 'value2'}, ... ]
我完全不知道为什么这是“丑陋的”和“ blo肿的”。存储复杂对象列表再简单不过了。但是,将对象滥用为列表绝对是丑陋的:对象具有关联的数组语义(即,给定名称只能有一个字段),而列表/数组则没有:
// 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是一个对象数据库,而不是键/值存储。