gpt4 book ai didi

javascript - 在一次数据库调用中更新插入多个子文档

转载 作者:行者123 更新时间:2023-11-30 19:48:16 25 4
gpt4 key购买 nike

如果我有一个包含对象数组的文档。

Document = {
_id: 1,
doc_amount: 0,
subDocsArray: [
{
_id: 1,
amount: 0
},
{
_id: 2,
amount: 1
},
...
]
}

我可以简单地通过做...来增加 doc_amount

Document.updateOne({ _id }, { $inc: { doc_amount: 1} })

但是增加 subDocsArray 中的数量更加棘手。如果我有 Document.subDocsArray 的更新数组

var newSubDocsArray = [
{
_id: 1,
amount: 5
},
{
_id: 2,
amount: 5
},
]

如何在一次调用中增加 Document.subDocsArray 中的所有金额?请记住,newSubDocsArray 可能并不总是包含 subDocsArray 中的每个项目,因此需要更新插入。

这可能吗?

编辑:为清楚起见,newSubDocsArray 中的所有金额都可以是不同的值。每个现有的 subDoc 数组项数量应增加具有相同 id 的 newSubDocs 中数量的值。

最佳答案

由于我没有真正回答上一个答案中的问题,这里有一个新的。

Afaik,您不能在 Mongodb 的一次调用中执行此操作,但您需要为每个新数组元素调用一次。然后你可以使用arrayFilters更新所有与当前元素匹配的项目。这是一个具有不同行为的示例:

您的原始文档:

{ 
"_id" : 1.0,
"doc_amount" : 0.0,
"subDocsArray" : [
{
"_id" : 1.0,
"amount" : 20.0
},
{
"_id" : 2.0,
"amount" : 31.0
},
{
"_id" : 3.0,
"amount" : 3.0
},
{
"_id" : 5.0
}
]
}

应用这个脚本:

var newSubDocsArray = [
{
_id: 1,
amount: 3
},
{
_id: 2,
amount: 8
},
{
_id: 4,
amount: 7
},
{
_id: 5,
amount: 9
},
];


newSubDocsArray.forEach(function(newSubDoc){
db.getCollection("test").update(
{_id:1},
{$inc:{"subDocsArray.$[subdoc].amount":newSubDoc.amount}}, // Note the use of $[subdoc]
{ multi: true,
arrayFilters: [ { "subdoc._id": newSubDoc._id } ]
}
)
})

将结果:

{ 
"_id" : 1.0,
"doc_amount" : 0.0,
"subDocsArray" : [
{
"_id" : 1.0,
"amount" : 23.0 // +3
},
{
"_id" : 2.0,
"amount" : 39.0 // +8
},
{
"_id" : 3.0,
"amount" : 3.0 // unchanged
},
{
"_id" : 5.0,
"amount" : 9.0 // created, set to 9
}
]
}

你可以注意到:

  • _id 为 3 的项目未更新(不在新的 newSubDocsArray 中)。
  • _id 为 4 的项目未在数组中创建(arrayFilters 不匹配任何内容)。
  • _id 为 5 的项目创建了一个新的金额字段。

关于javascript - 在一次数据库调用中更新插入多个子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54747293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com