mongoose查询改变对象的顺序

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

有问题的查询是:

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

然而,mongoosedebugging的输出是:

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

唯一的变化就是被deletedOn字段从对象的最后位置移动到第一位置。 这意味着查询不会返回任何结果。

有没有解决这个问题的方法?

JavaScript中的对象属性没有sorting 。 您无法确保JavaScript对象上的属性顺序,不同的实现可能会以不同的顺序排列它们。 有关其他信息,请在相关问题上查看此答案 。

关键是从规范(ECMAScript)中我们得到:“一个对象是Objecttypes的一个成员, 它是一个无序的属性集合,每个属性都包含一个原始值,对象或函数。一个对象的属性被称为一个方法。“

没有“解决scheme”,因为这是预期的行为。 所以真正的问题是,为什么顺序对你来说很重要? 你想做什么?

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

例如:

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