Mongodb 高效地修改子文档

Mongodb 高效地修改子文档,mongodb,mongodb-query,Mongodb,Mongodb Query,我有以下文件: { A1:1, A2:2, A3:[ {测试:“B1”,值:3}, {测试:“B2”,值:4} ] } 我想将文档更新为如下所示: { A1:10,/“A1”变为10 A2:2,/“A2”保持不变 A3:[ {test:“B1”,value:30},//“value”变为30,其中“test”是“B1” {test:“B2”,value:4},//“value”保持不变,其中“test”为“B2” {test:“B3”,值:50}//添加一个新的子文档 ], A4:60/“A4

我有以下文件:

{
A1:1,
A2:2,
A3:[
{测试:“B1”,值:3},
{测试:“B2”,值:4}
]
}
我想将文档更新为如下所示:

{
A1:10,/“A1”变为10
A2:2,/“A2”保持不变
A3:[
{test:“B1”,value:30},//“value”变为30,其中“test”是“B1”
{test:“B2”,value:4},//“value”保持不变,其中“test”为“B2”
{test:“B3”,值:50}//添加一个新的子文档
],
A4:60/“A4”加上60的值
}
如果我没有子文档数组,只需要更改
A*
值,我可以简单地使用
$set
,它既可以设置
A1
的值,也可以添加
A4

{$set:{A1:10,A4:60}

如何以最少的查询量以原子方式应用上述所有更改?

我最初尝试仅使用一个查询来更新文档,但似乎无法在同一查询中的任何给定数组上运行两个操作。这是我得到的错误:

WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
                "code" : 16837,
                "errmsg" : "Cannot update 'A3.0.value' and 'A3' at the same time
"
        }
})
然后我决定将该查询分为两部分,并设法获得所需的功能

在第一个查询中,我在
A3
数组中搜索了所有具有测试值为
B1
的对象的文档,并将该特定对象的值设置为30

另外,由于默认情况下
A1
的值会更改,因此我更新了它的值,并添加了
A4
,因为它是一个新元素

然后我指定了
multi
参数,以便更新所有符合条件的文档

db.collection.update({ A3: { $elemMatch: { test: "B1"} } }, 
                           { $set: { "A3.$.value": 30, A1: 10, A4: 60 }}, 
                           { multi: true});
在第二个查询中,我搜索了所有具有现有
A3
数组的文档,并推送了新对象

db.collection.update({ A3: { $exists: true }}, 
                           { $push: { A3: { test: "B3", value: 50 }}}, 
                           { multi: true});