gpt4 book ai didi

java - MongoDB - $set with findAndModify 或 update on embedded documents

转载 作者:行者123 更新时间:2023-11-29 03:22:06 24 4
gpt4 key购买 nike

我想使用 findAndModify 来更新嵌入文档的字段。例如,如果我要插入此文档。

{
'name':'Goku',
'level':9000,
'family':{
'son':'Grandpa Gohan',
'wife':'Chi Chi'
}
}

然后稍后插入以下文档:

{
'name':'Goku',
'type':'Super Saiyan',
'family':{
'son':'Gohan',
'father':'Bardock'
}
}

期望的最终结果是:

{
'name':'Goku',
'level':9000,
'type':'Super Saiyan',
'family':{
'son':'Gohan',
'father':'Bardock',
'wife':'Chi Chi'
}
}

我尝试使用下面的代码在 Java 中实现它,但没有成功。是否有任何内置功能可以实现上述预期结果?

String json = "{'name':'Goku', 'level':9000, 'family':{'son':'Grandpa Gohan', 'wife':'Chi Chi'} }";
DBObject document = (DBObject) JSON.parse(json);
BasicDBObject update = new BasicDBObject("$set", document);
BasicDBObject query = new BasicDBObject().append("name", document.get("name"));
collection.findAndModify(query, null, null, false, update, false, true);

json = "{'name':'Goku', 'type':'Super Saiyan', 'family':{'son':'Gohan', 'father':'Bardock'} }";
document = (DBObject) JSON.parse(json);
update = new BasicDBObject("$set", document);
query = new BasicDBObject().append("name", document.get("name"));
collection.findAndModify(query, null, null, false, update, false, true);

-- 编辑--

Neil Lunn 在下面发布了正确答案。对于任何想知道这在 Java 中意味着什么的人,您只需更改上面代码的一行即可获得所需的结果:

[...]

json = "{'name':'Goku', 'type':'Super Saiyan', 'family.son':'Gohan', 'family.father':'Bardock'} }";
[...]

最佳答案

你走在正确的轨道上,但问题是你最终传递了整个子文档,这会覆盖现有条目。

为了得到你想要的,你需要使用类似这样的“点符号”来打破你的更新:

db.collection.update(
{ "name": "Goku" },
{
"$set": {
"type": "Super Saiyan",
"family.son": "Gohan",
"family.father": "Bardock"
}
}
)

因此,当您完全指定键时,您实际上并没有替换整个子文档,而是添加了额外的条目。

关于java - MongoDB - $set with findAndModify 或 update on embedded documents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23026722/

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