猫鼬复合索引创建字段顺序

Har*_*tal 5 mongoose mongodb node.js mongoose-schema

我对mongodb中的复合索引创建有疑问:说我想创建此复合索引:

cSchema.index({account:1, authorization: 1, c_type: 1});
Run Code Online (Sandbox Code Playgroud)

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

我如何确保它确实{account:1, authorization:1, c_type:1}按顺序排列?

谢谢 !

Mat*_*att 5

简单的答案是,大多数人滥用了不解析为对象上的整数的简单字符串属性将按创建顺序枚举的行为。虽然在 ES2015 中不能保证某些枚举方法,但它确实可以在 Node/V8 这样的受限环境中工作。这已经在大多数 JS 引擎中运行了一段时间,但在 ES2015 之前从未成为 ES 规范的一部分。

MongoDB

底层 MongoDB 驱动createIndex函数支持String,ArrayObject索引定义。解析代码位于名为 的 util 函数中parseIndexOptions

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

['location','type']
[['location', '2d'],['type', 1]]
[{location: '2d'},{type: 1}]
Run Code Online (Sandbox Code Playgroud)

另请注意,代码在获取索引属性时createIndex确实会进行枚举。Object.keysObject

猫鼬

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

不过,有几个地方需要进一步处理索引。例如,当您创建带有索引的子文档时,索引需要在字段名称上添加父架构前缀。快速浏览一下,我认为这段代码仍然适用于数组,但我在 Mongoose 代码中看不到任何测试,因此您可能需要自己确认。

Mongoose 确实有一个依赖于 Object property order 的复合索引测试