3

私は次のようなJSONを持っています:

{ "_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);

次のエラーが表示されます。

java.lang.IllegalArgumentException: データベースに格納されているフィールドは「$」で開始できません (不正なキー:「$push」)

私が使用したとき:

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

次の例外が発生しました。

java.lang.IllegalArgumentException: クラス com.model.Test をシリアライズできません

私は試しました: db.updateMulti(updateQuery, updateCommand); 例外も更新もドキュメントに発生しませんでした。

だから私はここで何が欠けています!!

4

1 に答える 1

14

次のドキュメントをコレクションに挿入しようとしているため、save()メソッドが失敗します:{"$ push":{"resources":[リソースのリスト]}}、および"$push"は有効なキーではありません名前。

あなたの質問から、「itemList」内の{"itemID":"1"}に一致する埋め込みドキュメント内の埋め込みドキュメントのリスト"resources"に別のリソースドキュメントを追加しようとしているように見えます。これは正しいです?

埋め込まれたドキュメントのレイヤーを処理するのは難しいですが、それは可能です
。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

「$push」修飾子のドキュメントは、「更新」ページにもあります: http ://www.mongodb.org/display/DOCS/Updating#Updating-%24push

投稿されたコードからは、「リソース」がリストのように見えます。使用する必要のあるメソッドが$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に精通しているコミュニティの別のメンバーが支援できる可能性があります。

于 2012-04-09T18:15:04.933 に答える