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. ]