【问题标题】:Proper way in Mongo to update the value of a key without removing old values?Mongo中更新键值而不删除旧值的正确方法?
【发布时间】:2014-09-01 07:15:39
【问题描述】:

我正在尝试使以下内容正常工作,但 $set 无法正常工作。挠头。

我们在 Mongo 中有什么:

{
    _id: "123",
    mechanics: {
        engine: [
            "129hp",
            "300hp",
            "500hp"
        ]
    }
}

我们的 javascript 中的对象:

{
    mechanics: {
        brakes: [
            "30cm",
            "60cm",
            "90cm"
        ]
    }
}

如何编写更新查询以使 Mongo 文档看起来像这样?

{
    _id: "123",
    mechanics: {
        engine: [
            "129hp",
            "300hp",
            "500hp"
        ],
        brakes: [
            "30cm",
            "60cm",
            "90cm"
        ]
    }
}

mechanics 执行$set 不起作用,因为它会删除engine 并添加brakes

【问题讨论】:

    标签: javascript mongodb mongodb-query


    【解决方案1】:

    你基本上想要的是"dot notation",这意味着你的$set更新部分是这样的:

    { "$set" : { "mechanics.brakes" : [ "30cm", "60cm", "90cm" ] } }
    

    要在 JavaScript 中处理一个对象,就像您在此表单中显示的那样,您可以执行以下操作:

    var upd = { "$set": {} };
    
    var obj = {
        mechanics: {
            brakes: [
                "30cm",
                "60cm",
                "90cm"
            ]
        }
    };
    
    Object.keys( obj ).forEach(function(top) {
        Object.keys( obj[top] ).forEach(function(inner) {
            upd["$set"][ top + "." + inner ] = obj[top][inner]
        });
    })
    

    从基本的obj 输入形成更新语句并根据需要更新数据库。

    【讨论】:

    • 谢谢!是的,我想了很多 - 你必须找到一种方法来删除 mechanics.brakes 对象的父键,或者只将值传递给 Mongo 操作。只是想知道 Mongo 中是否有其他运算符或其他东西仅用于添加值但不替换现有值。
    • @fuzzybabybunny 有several update operators,它们的目的都是不覆盖文档中的其他现有字段。但是,您需要的是带有要更新的元素的完整路径的“点表示法”。
    猜你喜欢
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多