我有一个在我的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
}
]
}
}
但是,mongoose debug的输出是:
users.find({
attributes: {
'$all': [
{
deletedOn: null,
attribute: 'an id',
value: 'a value'
},
{
deletedOn: null,
attribute: 'an id again',
value: 'a value'
}
]
}
},
{ fields: {} }
)
唯一的变化是deletedOn
字段从对象的最后位置移动到第一个位置。这意味着查询不返回任何结果。
这个问题有什么解决方案吗?
答案 0 :(得分:0)
JavaScript中的对象属性未订购。您无法确保JavaScript对象的属性顺序,并且不同的实现可能会以不同的顺序对它们进行排序。有关其他信息,请参阅this answer on a related question。
基本关键是我们得到的规范(ECMAScript):"对象是Object类型的成员。 它是一个无序的属性集合,每个属性都包含一个原始值,对象或函数。存储在对象属性中的函数称为方法。"
没有"解决方案",因为这是预期的行为。所以真正的问题是,为什么订单对你很重要?你想做什么?
答案 1 :(得分:0)
添加上一个答案,如果顺序对您很重要,则应使用数组而不是对象。
例如:
"$all": [
[
{"attribute": "an id"},
{"value": "a value"},
{"deletedOn": null},
],
...etc.
]