MongoDB - $使用findAndModify设置或在嵌入文档上更新

时间:2014-04-12 05:59:03

标签: java mongodb findandmodify

我想使用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'} }";
[...]

1 个答案:

答案 0 :(得分:3)

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

为了得到你想要的东西,你需要使用"点符号"来打破你的更新。类似于:

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

因此,当您完全指定密钥时,您实际上并未替换整个子文档,而是添加其他条目。