2012-04-07 6 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')

は:

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

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

を私は次の例外を得ました

私は試みました: db.updateMulti(updateQuery、updateCommand); 私は例外を何も得ておらず、更新はドキュメントに反映されませんでした。

ここで私は何が欠けているのですか?

答えて

14

{"$ push":{"resources":リソースのリスト}}} "$ push"は次のドキュメントをコレクションに挿入しようとしているため、有効なキー名ではありません。

「itemID」:「1」と一致する埋め込みドキュメント内の埋め込みドキュメント「リソース」のリストに別のリソースドキュメントを追加しようとしているように見えますが、アイテムリスト"。これは正しいです?埋め込まれた文書の層への対処

はトリッキーですが、それは行うことができます:ここでは
は、以下の文書は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、である可能性があります。Javaドライバを使用して http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll

、上記のインサートはそうのように行うことができる。

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ドライバを使用してモンゴでどのように動作するかの理解を向上させます。私はこの質問もSpring( "mongoOperations"はSpringパッケージのクラスです)に関連していることに気づいていますが、残念ながらそれは慣れていません。あなたのアップデートにまだ問題がある場合は、おそらくSpringに精通したコミュニティの他のメンバーが支援することができます。

+0

ありがとうございました。非常に役に立ちました。 – Echo

関連する問題