如何使用多个选择条件更新 mongodb 对象

How to update a mongodb object using multiple selection criteria

我的模式结构如下所示:

{
    "__v":0,
    "_id":ObjectId("5708423e897db8255aaaa9dd"),
    "podId":169400000005,
    "env":[
    {
        "type":"1",
        "id":3852000000035,
        "_id":ObjectId("5708423e897db8255aaaa9de")
    },
    {
        "type":"2",
        "id":3852000000040,
        "_id":ObjectId("5708423e897db8255aaaa9df")
    }
    ],
    "name":"Test Build",
    "parameters":[
    {
        "name":"sound.left",
        "type":"1",
        "paramName":"Left Sound Control",
        "paramType":"booleanParameter",
        "testValue":null,
        "liveValue":null,
        "_id":ObjectId("5708423f897db8255aaaaa0d")
    },
    {
        "name":"sound.right",
        "type":"1",
        "paramName":"Right Sound Control",
        "paramType":"booleanParameter",
        "testValue":null,
        "liveValue":null,
        "_id":ObjectId("5708423f897db8255aaaaa0d")
    },
    ...
    ]
}

我有 3 个已知变量:podId 代表 podIdcodeName 代表 parameters.nameenvType 代表 parameters.type。使用它们我想使用 podIdcodeNameenvType 更新对象,新变量 paramValue 将包含 testValue 值。

我试过的

db.pods.update({
    podId: podId,
    parameters: {
        $elemMatch: {
            name: codeName,
            type: envType
        }
    }
}, {
    $set: {
        'parameters.$.testValue': paramValue
    }
});

我正在尝试更新 testValue,其中 podId == podIdparameters.name == codeNameparameters.type == envType,但上面没有更新任何内容。

我也试过了

db.pods.update({
    podId: podId,
    parameters: {
        name: codeName,
        type: envType
    }
}, {
    $push: {
        parameters: {
            testValue: paramValue
        }
    }
},
    function(err) {
        if(err) throw err;
    });

基本上是在我只需要比较 podId 时采用构建对象的有效方法,并添加额外的标准;这次没用。

edit:将模式类型 Number 固定为 String

让这些成为您在 mongo shell:

中的变量
> var podId = 169400000005
> var codeName = "sound.right"
> var envType = "1"
> var paramValue = "updatedParamValue"

您可以尝试此查询:

db.test.update({"podId":podId, "parameters.name" : codeName, "parameters.type" : envType}, {$set : {"parameters.0.testValue" : paramValue,"parameters.1.testValue" : paramValue}})

根据您要更新的测试值,您可以将索引传递给它。 更新

更新查询后得到以下结果:

db.test.find().pretty()

{ "_id" : ObjectId("570c850ab9477f18ac5297f9"), "__v" : 0, "podId" : 169400000005, "env" : [ { "type" : "1", "id" : 3852000000035, "_id" : ObjectId("5708423e897db8255aaaa9de") }, { "type" : "2", "id" : 3852000000040, "_id" : ObjectId("5708423e897db8255aaaa9df") } ], "name" : "Test Build", "parameters" : [ { "name" : "sound.left", "type" : "1", "paramName" : "Left Sound Control", "paramType" : "booleanParameter", "testValue" : "updatedParamValue", "liveValue" : null, "_id" : ObjectId("5708423f897db8255aaaaa0d") }, { "name" : "sound.right", "type" : "1", "paramName" : "Right Sound Control", "paramType" : "booleanParameter", "testValue" : "updatedParamValue", "liveValue" : null, "_id" : ObjectId("5708423f897db8255aaaaa0d") } ] }

谢谢。