如何使用java更新mongoDB中的部分嵌套文档

时间:2014-12-20 19:57:37

标签: java mongodb mongodb-query mongodb-java

这是我的文件:

{ "_id" : ObjectId("5495cfcaec1e18b48015bba3"),
  "Type" : "1", 
  "DomainSize" : "60",
  "Metadata" : { "visit" : "3550", 
                 "website" : "1", 
                 "Specifics" : { "Size:" : "2", 
                                 "Type:" : "Janes",
                                 "Closure Type:" : "Slip-On"}, 
                  "cat" : "2", 
                  "function" : "6"},
  "rate" : " 95.5% "}

我想从Metadata中更新几个我事先不知道的密钥。 我的输入是元数据列表中存在的键和值的映射。 我正在用另一个地图包裹给定的地图,其中关键是“元数据”和给定地图的值。

Map<String,Map<String,String>> metadata =new HashMap();
metadata.put("Metadata", values);

所以我最终得到了一个

<"Metadata", Map<Key,Value>>

然后我使用了以下内容:

m_collection.update(new BasicDBObject("_id",id) , new BasicDBObject("$set", new BasicDBObject(metadata)));  

记录更新嵌套地图中的现有密钥,将'[]'添加到每个值,并删除所有未更新的密钥。

例如,给定的地图为{'visit': '3558' , 'website' : '20'}

更新后我最终得到:

{ "_id" : ObjectId("5495cfcaec1e18b48015bba3"),
      "Type" : "1", 
      "DomainSize" : "60",
      "Metadata" : { "visit" : ["3558"], 
                     "website" : ["20"]},
      "rate" : " 95.5% "}

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您在&#34;元数据&#34;上调用$ set它会丢弃任何内容,并根据您传入的内容设置新值。如果您只想部分更新这样的文档,则您必须传递完整的文档以反映新状态或仅发出$设置更新:每个要更改的字段一个。

答案 1 :(得分:0)

您需要在用于$set

的字段名称中使用点分表示法

请参阅https://docs.mongodb.org/manual/tutorial/modify-documents/