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

如何使用多个选择条件更新mongodb对象,mongodb,mongo-shell,Mongodb,Mongo Shell,我的架构结构如下所示: { "__v":0, "_id":ObjectId("5708423e897db8255aaaa9dd"), "podId":169400000005, "env":[ { "type":"1", "id":3852000000035, "_id":ObjectId("5708423e897db8255aaaa9de") }, { "type":"2",

我的架构结构如下所示:

{
    "__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
用于
podId
codeName
用于
参数。name
envType
用于
参数。type
。使用它们,我想使用
podId
codeName
envType
更新对象,使用一个新变量
paramValue
,该变量将包含
testValue

我尝试过的

db.pods.update({
    podId: podId,
    parameters: {
        $elemMatch: {
            name: codeName,
            type: envType
        }
    }
}, {
    $set: {
        'parameters.$.testValue': paramValue
    }
});
我正在尝试更新
testValue
,其中
podId==podId
parameters.name==codeName
,以及
parameters.type==envType
,但上面没有更新任何内容

我也试过了

db.pods.update({
    podId: podId,
    parameters: {
        name: codeName,
        type: envType
    }
}, {
    $push: {
        parameters: {
            testValue: paramValue
        }
    }
},
    function(err) {
        if(err) throw err;
    });
基本上,当我只需要比较
podId
时,就可以使用构建对象的方法,并添加额外的标准;这次不行了


编辑:将模式类型编号固定为字符串

让这些变量包含在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}})
根据要更新的testValue,可以将索引传递给该testValue。 更新

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

db.test.find().pretty()
{ “_id”:ObjectId(“570c850ab9477f18ac5297f9”), “_v”:0, “podId”:169400000005, “环境”:[ { “类型”:“1”, “id”:385200000035, “_id”:ObjectId(“5708423E897DB8255AA9DE”) }, { “类型”:“2”, “id”:385200000040, “_id”:ObjectId(“5708423E897DB8255AA9DF”) } ], “名称”:“测试生成”, “参数”:[ { “name”:“sound.left”, “类型”:“1”, “paramName”:“左声控”, “paramType”:“booleanParameter”, “testValue”:“更新的参数值””, “liveValue”:null, “_id”:ObjectId(“5708423F897DB8255AAA0D”) }, { “name”:“sound.right”, “类型”:“1”, “paramName”:“右声道控制”, “paramType”:“booleanParameter”, “testValue”:“更新的参数值””, “liveValue”:null, “_id”:ObjectId(“5708423F897DB8255AAA0D”) } ] }


谢谢。

参数。type
是字符串,您确定匹配的是字符串而不是整数吗?i、 e是
envType
1
“1”
?哎呀,我的问题打错了<代码>环境类型、
参数类型
环境类型
都是字符串。我更新了帖子以反映这一点。在这个模式中有几个pod,参数数组包含多达1000个参数对象。我只想更新特定对象的
testValue
,其中
podId
parameters.name
parameters.type
匹配。那么我建议的查询不起作用了?我写这个查询的时候已经记住了这一点。是的,
testValue
仍然是空的。哦!对不起,我错了,我已经更新了答案,请检查。仍然没有。我认为问题在于选择标准,因为当我在查找中使用它时,它不会返回任何内容。