gpt4 book ai didi

php - MongoDB 及其驱动程序能否保留文档元素的顺序

转载 作者:IT老高 更新时间:2023-10-28 13:10:08 25 4
gpt4 key购买 nike

我正在考虑使用 MongoDB 来存储包含键/值对列表的文档。存储它的安全但丑陋和臃肿的方式是

[ ['k1' : 'v1'] , ['k2' : 'v2'],  ...]

但是文档元素在底层 BSON 数据结构中固有地是有序的,所以原则上:

{k1 : 'v1', 
k2 : 'v2', ...}

应该够了。但是我希望大多数语言绑定(bind)会将这些解释为关联数组,因此可能会打乱顺序。所以我需要知道的是:

  • MongoDB 本身是否 promise 保留第二种形式的项目排序。
  • 语言绑定(bind)是否有一些 API 可以提取它的有序形式——即使通常的“方便”API 返回一个关联数组。

我在这里主要对 Javascript 和 PHP 感兴趣,但我也想了解其他语言。感谢您提供任何帮助,或者只是指向我可以使用 RTM 的一些文档的链接。

最佳答案

从 2.6 版开始,MongoDB preserves the order of fields where possible.但是,_id 字段始终排在第一位,重命名字段可能会导致重新排序。但是,我通常会尽量不要依赖这样的细节。正如最初的问题所提到的,还有额外的层需要考虑,每个层都必须为订单的稳定性提供某种保证......

原答案:

不,MongoDB does not make guarantees about the ordering of fields :

"There is no guarantee that the field order will be consistent, or the same, after an update."

特别是,更改文档大小的就地更新通常会更改字段的顺序。例如,如果您 $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 是一个对象数据库,而不是键/值存储。

关于php - MongoDB 及其驱动程序能否保留文档元素的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8576823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com