gpt4 book ai didi

javascript - MongoDB 是否支持 Map 对象?

转载 作者:可可西里 更新时间:2023-11-01 09:35:13 25 4
gpt4 key购买 nike

假设我在 node.js 应用程序中有一个有序项目的映射:

var myMap = new Map();
myMap.set("a", "b");
myMap.set("c", "d");
myMap.set("e", "f");

然后我使用 MongoDB node.js 驱动程序将此 map 存储在数据库中:

collection.insertOne({myMap: myMap});

存储的 map 如下所示:

{ "myMap" : { "a" : "b", "c" : "d", "e" : "f" } }

我知道 Map 的顺序是有保证的,但是它能保证按顺序存储在 MongoDB 中吗?是否保证按该顺序从 MongoDB 读取它?

这是一个非常简单的问题,但我在 MongoDB 文档中找不到任何关于它支持 map 的内容。

最佳答案

首先澄清一下。尽管 JavaScript 规范并未规定对象“必须”保留键的顺序,但几乎每个实现实际上都保留了标准对象的键顺序。

至于 MongoDB 文档,从技术上讲,它没有记录在那里,因为实际保留顺序因此是 BSON 规范,其中键的顺序保证的。而 BSON 实际上并不局限于 MongoDB。

至于真正的问题,让我们从BSON serializer的内部函数来看代码使用:

  } else if(object instanceof Map) {    //<-- Actually looks for the type and handles it
var iterator = object.entries();
var done = false;

while(!done) {

在 list 中依此类推,它基本上是迭代 Map 中的每个条目,然后使每个成员都接受相同的测试条件和分支(不完全是最 DRY 代码)关于一般的顶层检查。

然而,有一个“重要”注意事项,即 MongoDB 作为存储引擎可能需要在文档大小超过其初始分配的情况下重新定位磁盘上的数据。在此类文档重写下,由于实际存储在 MongoDB 中的项目实际上不再是 Map,因此存储文档中的键“可能”“可能”重新排序。

多年来出现了几个与内容重新排序相关的问题,虽然大多数问题都已得到解决,但至少要意识到这有可能发生并不是没有道理的。

从中吸取的重要教训应该是:

  1. 对象键通常会按照您创建它们的顺序进行序列化,尽管引擎“必须”这样做并不是硬性规范。

  2. 序列化为 BSON 的底层方法以不同方式处理 Map,并且正在竭尽全力确保顺序得到维护。

  3. 由于最终的“存储”取决于服务器上的 BSON 规范,因此您真正“确保”订购商品的唯一方式是使用“数组”。当顺序很重要时,这确实是您应该始终使用的。

无论如何,Map 并不是真正为“有序键”实现的,我认为 main documentation完美凸显“三巨头”:

  • An Object has a prototype, so there are default keys in the map. This could be bypassed by using map = Object.create(null) since ES5, but was seldomly done.
  • The keys of an Object are Strings and Symbols, where they can be any value for a Map.
  • You can get the size of a Map easily while you have to manually keep track of size for an Object.

那是他们真的变得有用了。

作为总结行 “MongoDB 是否支持 Map 对象”?技术上没有,因为 BSON 没有相应的类型。但是驱动程序会将其正确转换为存储为 BSON 文档,但当然一切都受那里应用的相同规则的约束。因此,驱动程序和语言支持是“可选的”,因为 BSON 中没有任何内容表明这是一个 Map,那么将由实现的代码将数据读入类似的“Hash/Map” "遵循相同规则的存储。

因此,如果您只是“真正”对始终保持插入/维护顺序感兴趣,那么请改用“数组”。

关于javascript - MongoDB 是否支持 Map 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36119442/

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