猫鼬查询更改对象顺序



我有一个在我的 Node 后端生成的查询 - 如果我注销并在 Mongo shell 中运行它,那么一切都很好,但是,如果我使用 mongoose 做Model.find(query),那么会发生一些奇怪的属性重新排序并且查询中断。

有问题的查询是:

{
"attributes": {
"$all": [
{
"attribute": "an id",
"value": "a value",
"deletedOn": null
},
{
"attribute": "an id again",
"value": "a value",
"deletedOn": null
}
]
}
}

但是,猫鼬调试的输出是:

users.find({ 
attributes: { 
'$all': [ 
{ 
deletedOn: null,
attribute: 'an id',
value: 'a value'
},
{
deletedOn: null,
attribute: 'an id again',
value: 'a value'
}
]
} 
},
{ fields: {} }
)

唯一的变化是将deletedOn场从对象中的最后一个位置移动到第一个位置。 这意味着查询不返回任何结果。

这个问题有什么解决方案吗?

JavaScript 中的对象属性没有排序。您无法确保 JavaScript 对象上属性的顺序,不同的实现可能会以不同的方式对它们进行排序。有关其他一些信息,请参阅有关相关问题的此答案。

关键是,从规范(ECMAScript(中我们得到:"对象是对象类型的成员。它是属性的无序集合,每个属性都包含一个基元值、对象或函数。存储在对象属性中的函数称为方法。

没有"解决方案",因为这是预期的行为。所以真正的问题是,为什么订单对你很重要?你想做什么?

加上前面的答案,如果顺序对你很重要,你应该使用数组而不是对象。

例如:

"$all": [
[
{"attribute": "an id"},
{"value": "a value"},
{"deletedOn": null},
],
...etc.
]

最新更新