如何使用多个选择条件更新 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
代表 podId
,codeName
代表 parameters.name
,envType
代表 parameters.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
时采用构建对象的有效方法,并添加额外的标准;这次没用。
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")
}
]
}
谢谢。
我的模式结构如下所示:
{
"__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
代表 parameters.name
,envType
代表 parameters.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
时采用构建对象的有效方法,并添加额外的标准;这次没用。
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") } ] }
谢谢。