当前位置: 首页 > 面试题库 >

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

李跃
2023-03-14
问题内容

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

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

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

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

应该足够了。但是,我希望大多数语言绑定都将它们解释为关联数组,因此可能会扰乱顺序。所以我需要知道的是:

  • MongoDB本身是否 承诺 保留第二种形式的项目顺序。
  • 语言绑定是否具有一些可以提取有序形式的API -即使通常的“便捷” API返回了关联数组。

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


问题答案:

从2.6版开始,MongoDB会尽可能保留字段顺序。但是,该_id字段始终排在第一位,重命名字段可能导致重新排序。但是,我通常会尽量不要依赖此类细节。正如原始问题所提到的那样,还需要考虑其他一些层,每个层都必须为订单的稳定性提供某种保证…

原始答案:

不,MongoDB 不保证字段的顺序:

“不能保证更新后的现场订单会保持一致或相同。”

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



 类似资料:
  • 问题内容: 我注意到JSON对象中元素的顺序不是原始顺序。 JSON列表的元素呢?他们的订单得到维护吗? 问题答案: 是的,JSON数组中元素的顺序得以保留。从RFC 7159开始-JavaScript对象表示法(JSON)数据交换格式 (重点是我的): 对象是零个或多个名称/值对的 无序 集合,其中名称是字符串,值是字符串,数字,布尔值,null,对象或数组。 数组是零个或多个值的 有序 序列。

  • 我尝试使用scala 2.11.7在mongodb 3.0.7中保存一个文档,然后进行快速访问:http://mongodb.github.io/mongo-scala-driver/1.0/gett-start/quick-tour/,但是我运行了这个示例,没有发生任何事情。不创建数据库、集合和文档。 控制台: 少了什么?

  • 问题内容: 我有一个非常大的.xml文件,我正在尝试制作一个新的.xml文件,该文件只包含了该较大文件内容的一小部分。我想指定一个属性(在我的情况下为itemID),并为其指定一些特定的值,然后它将除去所有具有那些itemID及其子元素的元素。 我的大型.xml文件如下所示: 该文件大约有9万行,大约9兆字节。 注意如何有itemID,某些项目类型可以(但不总是)在其中包含更多项目,并且这些子项也

  • 驱动程序版本为: 我的问题是,当我使用api find和一些来自java的过滤器时,操作需要15秒。 我检查了mongo服务器日志文件,发现跟踪是一个命令,而不是一个查询: 2015-09-01T12:11:47.496+0200I命令[conn503]命令b.$CMD命令:计数{count:“logs”,查询:{timestamp:{$GTE:新日期(1433109600000)},aplica

  • 当我试图将元素放入元素中时,我面临一个问题。我尝试了两种方法来实现这一点,但不幸的是没有成功。 上面的代码获取所有DOM元素列表。 方法1: 当我尝试这个方法时,它总是返回第一个元素的文本,而不是相应的元素文本。 在搜索时,我发现了一个链接,有人问了和我一样的问题。 Selenium Webdriver在子元素中查找元素 当我尝试答案时,它给了我一个空白数组。 结果: 请建议我如何实现这一点,如何

  • 在上面的代码中,我试图更新文档中的属性子集。更新后,我看到整个文档被子集替换了。有没有办法用mongo-java-driver的bulkwrite操作来更新属性子集?