2014-12-20 17 views
2

這裏更新部分嵌套文件中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% "} 

我想更新從元數據幾個鍵,我不知道提前。 我的輸入是元數據列表中存在的鍵和值的映射。 我用另一個Map關鍵字是「元數據」和給定地圖的值包裝給定的地圖。

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% "} 

我做了什麼錯?

回答

1

你打電話給$設置「元數據」,它放棄那裏的任何內容,並設置新的值與你傳入的任何內容。如果你只想部分更新這樣的文件,你必須通過一個完整的文件來反映新的狀態或只是發行$ set更新:每個字段更改一個。

+0

陛下...着我拉的對象從數據庫中,把拉動元數據值,它的地圖,然後把地圖內的更新值摺疊起來放在數據庫中?我只是怕有很多電話到數據庫。實際上更新操作將被調用大約30〜更新的值並幾乎每秒(這只是應用程序的一小部分) – USer22999299

+2

您可以這樣做,但是對於每個文檔而言,這將是完整的往返行程。也許這很好,也許不是,但你需要考慮性能影響。 – evanchooly