我有一个在我的 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.
]