gpt4 book ai didi

mongodb - 更新 MongoDb 中的深度记录

转载 作者:可可西里 更新时间:2023-11-01 09:13:41 25 4
gpt4 key购买 nike

我在 MongoDb 中有这条记录,并且正在使用 native API:

{
"_children" : {
"addressesR" : [
{
"id" : ObjectId("530eea01071bd1a53065c1a6"),
"personId" : ObjectId("530eea01071bd1a53065c1a4"),
"street" : "ivermey",
"city" : "perth",
"_children" : {
}
},
{
"_children" : {
"configId" : {
"a" : {
"_children" : [
{
"b" : 10
},
{
"b" : 20
}
]
}
}
},
"city" : "perth",
"configId" : ObjectId("530eea01071bd1a53065c1a3"),
"id" : ObjectId("530eea01071bd1a53065c1a5"),
"personId" : ObjectId("530eea01071bd1a53065c1a4"),
"street" : "bitton"
}
],
}
}

我需要在一个查询中将嵌套的“b”更新为 30。我可以找到记录:

db.peopleR.find( { '_children.addressesR._children.configId.a._children.b': 20 } );

但我很难找到更新该特定值的方法。

我正在尝试:

db.peopleR.update( { '_children.addressesR._children.configId.a._children.b': 20 }, { $set: { '_children.addressesR.$._children.configId.a.$._children.b': 30 }   }  )

但我得到:

Cannot apply the positional operator without a corresponding query field containing an array.

现在,考虑到对于其他约束,我绝对需要更新 just 'b',我有办法做到这一点吗?或者,不可能两次使用 $ 操作数? (也就是说,如果对象仅向下一级,我只能更新对象的内部部分?)

最佳答案

问题是您不能使用 $ 运算符来显示数组中嵌套级别的匹配。最重要的是,您只能指定一次。

documentation 所述, $ 匹配找到的第一个 元素。这不是意味着如果您的查询有多个匹配项,那么只会选择第一个,这也意味着第一个匹配数组位置将被使用。这意味着这样的事情也行不通:

{ $set: { '_children.addressesR.1._children.configId.a._children.$.b': 30 } 

因为这会错误地匹配 index 1 值并更新您不期望的项目。

如果您可以更新整个 数组,那么下面的方法就可以了:

{ $set: {"_children.addressesR.$._children.configId.a._children": [ { b: 10}, { b: 30} ] } }

正如我所说,因为 indexfirst 数组匹配。

但考虑到您的结构,您最好的选择似乎是将该顶级数组更改为子文档。除非实际上这是一个数组,而不是现在看起来的两种混合文档类型。

关于mongodb - 更新 MongoDb 中的深度记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22062222/

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