Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MongoDB-$set,带findAndModify或update的嵌入式文档_Java_Mongodb_Findandmodify - Fatal编程技术网

Java MongoDB-$set,带findAndModify或update的嵌入式文档

Java MongoDB-$set,带findAndModify或update的嵌入式文档,java,mongodb,findandmodify,Java,Mongodb,Findandmodify,我想使用findAndModify向上插入嵌入文档的字段。例如,如果我要插入此文档 { 'name':'Goku', 'level':9000, 'family':{ 'son':'Grandpa Gohan', 'wife':'Chi Chi' } } 然后,在稍后的某个时间插入以下文档: { 'name':'Goku', 'type':'Super Saiyan', 'family':{ 'son':'Gohan

我想使用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(
{“名字”:“小悟空”},
{
“$set”:{
“类型”:“超级赛扬”,
“家庭。儿子”:“戈汉”,
“家庭。父亲”:“巴多克”
}
}
)

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

您的思路是正确的,但问题是您最终要传递整个子文档,这将覆盖现有条目

为了得到您想要的,您需要使用类似于以下内容的“点符号”将更新分解:

db.collection.update(
{“名字”:“小悟空”},
{
“$set”:{
“类型”:“超级赛扬”,
“家庭。儿子”:“戈汉”,
“家庭。父亲”:“巴多克”
}
}
)
因此,当您完全指定键时,实际上并不是替换整个子文档,而是添加额外的条目