【问题标题】:Mongoose query altering object order猫鼬查询改变对象顺序
【发布时间】:2018-01-14 18:48:29
【问题描述】:

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

这个问题有解决办法吗?

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

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

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

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

【讨论】:

  • 顺序很重要,因为查询 MongoDB { a: 1, b: 2 } 不等于 { b: 2. a: 1 } - mongo 使用 BSON 而不是 JSON,其中属性顺序是一致的。
【解决方案2】:

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

例如:

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

【讨论】:

    猜你喜欢
    • 2020-01-22
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    相关资源
    最近更新 更多