Mongoose查询改变对象顺序

时间:2017-08-07 12:48:40

标签: node.js mongodb mongoose

我有一个在我的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字段从对象的最后位置移动到第一个位置。这意味着查询不返回任何结果。

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

2 个答案:

答案 0 :(得分:0)

JavaScript中的对象属性未订购。您无法确保JavaScript对象的属性顺序,并且不同的实现可能会以不同的顺序对它们进行排序。有关其他信息,请参阅this answer on a related question

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

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

答案 1 :(得分:0)

添加上一个答案,如果顺序对您很重要,则应使用数组而不是对象。

例如:

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