2012-04-07 40 views
3

數組我有JSON這樣的:更新使用MongoDB的

{ "_id" : "1", "_class" : "com.model.Test", "itemList" : [ { "itemID" : "1", "itemName" : "Foo", "resources" : [ { "resourceID" : "1", "resourceName" : "Foo Test1", }, { "resourceID" : "2", "resourceName" : "Foo Test2", } ] } ] }

我需要能夠更新的資源列表。 我也做了以下內容:

BasicDBObject updateQuery = new BasicDBObject(); 
    updateQuery.put("id", "1"); 

    BasicDBObject updateCommand = new BasicDBObject(); 

    List<Resource> resources = populateResources();//Fetch a new list of Resources 
    updateCommand.put("$push", new BasicDBObject("resources", resources)); 


    MongoOperations mongoOperations = mongoConfiguration.getMongoTemplate(); 
    DBCollection db = mongoOperations.getCollection("myCollection"); 
    db.save(updateCommand); 

我得到follwoing錯誤:

java.lang.IllegalArgumentException: fields stored in the db can't start with '$' (Bad Key: '$push')

當我用:

db.update(updateQuery, updateCommand, true, true); 

我有以下異常:

java.lang.IllegalArgumentException: can't serialize class com.model.Test

我試過了: db.updateMulti(updateQuery,updateCommand); 我沒有得到任何例外,也沒有任何更新發生在文件中。

那麼我在這裏錯過了什麼!

回答

14

save()方法失敗,因爲它試圖將以下文檔插入到集合中:{「$ push」:{「resources」:[資源列表]}}和「$ push」是不是有效的密鑰名稱。

從您的問題看來,您似乎正嘗試將另一個資源文檔添加到嵌入文檔列表中的嵌入文檔「資源」,嵌入文檔匹配{「itemID」:「1」},在「 itemList中」。它是否正確?

與嵌入文檔的層處理是棘手的,但它可以做到:
這裏是如何在以下文件可以被插入到「資源」使用JS殼名單:

> var docToInsert = { "resourceID" : "3", "resourceName" : "Foo Test3"} 
> db.myCollection.update({_id:"1", "itemList.itemID":"1"}, {"$push":{"itemList.$.resources":docToInsert}}) 
> db.myCollection.find().pretty() 
{ 
    "_class" : "com.model.Test", 
    "_id" : "1", 
    "itemList" : [ 
     { 
      "itemID" : "1", 
      "itemName" : "Foo", 
      "resources" : [ 
       { 
        "resourceID" : "1", 
        "resourceName" : "Foo Test1" 
       }, 
       { 
        "resourceID" : "2", 
        "resourceName" : "Foo Test2" 
       }, 
       { 
        "resourceID" : "3", 
        "resourceName" : "Foo Test3" 
       } 
      ] 
     } 
    ] 
} 
> 

文檔 http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

的「$推」修改的文檔也是「更新」頁面上:在使用「$」位置運營商更新嵌入文檔可以將「更新」文件中找到 http://www.mongodb.org/display/DOCS/Updating#Updating-%24push

從發佈的代碼看起來好像「resources」是一個列表。這可能是你需要使用的方法是$ pushAll,用於添加多個值的列表: http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll

使用Java驅動程序,上面的插件可以做到像這樣:

Mongo m = new Mongo("localhost", 27017); 
DB db = m.getDB("test"); 
DBCollection myColl = db.getCollection("myCollection"); 

BasicDBObject docToInsert = new BasicDBObject("resourceID", "3"); 
docToInsert.put("resourceName", "Foo Test3"); 

BasicDBObject updateQuery = new BasicDBObject("_id", "1"); 
updateQuery.put("itemList.itemID", "1"); 

BasicDBObject updateCommand = new BasicDBObject("$push", new BasicDBObject("itemList.$.resources", docToInsert)); 

myColl.update(updateQuery, updateCommand); 
System.out.println(myColl.findOne().toString()); 

上述輸出如下:

{ "_class" : "com.model.Test" , "_id" : "1" , "itemList" : [ { "itemID" : "1" , "itemName" : "Foo" , "resources" : [ { "resourceID" : "1" , "resourceName" : "Foo Test1"} , { "resourceID" : "2" , "resourceName" : "Foo Test2"} , { "resourceID" : "3" , "resourceName" : "Foo Test3"}]}]} 

希望上面會提高你如何更新嵌入文檔與使用Java驅動程序Mongo的工作原理的理解。我注意到這個問題也與Spring有關(「mongoOperations」是Spring包中的一個類),我不太熟悉這個問題。如果您的更新仍然存在問題,或許更熟悉Spring的社區其他成員將能夠提供幫助。

+0

謝謝Marc.That非常有幫助。 – Echo 2012-04-10 17:59:29