node.js - Mongoose 复合索引创建字段顺序

我有一个关于在 mongodb 中创建复合索引的问题: 假设我想创建这个复合索引:

cSchema.index({account:1, authorization: 1, c_type: 1});

问题是,javascript 不保证字典顺序,所以我不能确定复合索引是否符合我想要的顺序。

如何确保它确实是 {account:1, authorization:1, c_type:1} 的顺序?

谢谢!

最佳答案

简单的答案是,大多数人滥用不解析为 Object 上的整数的简单 String 属性将按创建顺序枚举的行为。虽然not guaranteed in ES2015 for some enumeration methods ,它确实可以在像 Node/V8 这样的受限环境中工作。这已经在大多数 JS 引擎中工作了一段时间,但在 ES2015 之前从未成为 ES 规范的一部分。

MongoDB

底层 MongoDB 驱动程序 createIndex函数支持 StringArrayObject 索引定义。解析代码位于名为 parseIndexOptions 的 util 函数中。 .

如果您指定字符串、数组对或对象的数组,则顺序将是固定的:

['location','type']
[['location', '2d'],['type', 1]]
[{location: '2d'},{type: 1}]

还要注意 createIndex代码在获取索引属性的 Object 时确实使用 Object.keys 进行枚举。

Mongoose

Schema#index函数被记录为需要一个对象传递给“MongoDB 驱动程序的 createIndex() 函数”,因此看起来支持传递您提供的任何选项。

不过,有几个地方会进一步处理索引。例如,当您创建带有索引的子文档时,索引 needs to have the parent schema prefixed onto field names .快速浏览一下,我认为这段代码仍然适用于数组,但我在 Mongoose 代码中看不到任何测试,因此您可能需要自己确认。

Mongoose 确实有一个 compound index test that relies on Object property order .

https://stackoverflow.com/questions/43308644/

相关文章:

python - 大内存 Python 后台作业

node.js - Mongoose(或类似的 ODM)内存记录注册表?

javascript - 如何在 Node 议程中以编程方式定义多个具有相同名称的作业

mongodb - 为什么 mongo dot notation 会替换整个子文档?

mongodb - 语法错误 : missing ) after argument list @(s

java - 从 JAVA 应用程序使用 SSL 连接到 MongoDb

mongodb - 如何为 mongodb 副本集配置 grails 3

node.js - mongoose.connection.collections.collecti

node.js - 如何在 Mongoose 中定义排序函数

javascript - 如何将文件名设置为与数据库中的对象 ID 相同?