2017-08-03 10 views
0

私は、ネストされた文書はMongoCollection:ネストされたドキュメントを更新することはできません

Document{{_id=59837be4324fb01040068109, idKey=2323, objects=[Document{{24889=Document{{key1=val1, key2=val2}}}}]}} 

はJSON形式は、私が

String innerKey="24889"; 
mongoCollection.updateOne(eq("idKey", 2323),new Document("$set", new Document("objects."+innerKey+".key2", "val3"))); 

として更新しようとしましたが、この

{ 
    "_id": "59837be4324fb01040068109", 
    "idKey": 2323, 
    "objects": [{ 
     "24889": { 
      "key1": "val1", 
      "key2": "val2" 
     } 
    }] 
} 

ように見える更新しようとしていますが、もしそうなら、

Document updatedDoc = mongoCollection.find(eq("idKey", 2323)).first(); 

私はなぜオブジェクトが更新されませんでした

Document{{_id=59837be4324fb01040068109, idKey=2323, objects=[Document{{24889=Document{{key1=val1, key2=val2}}}}, null, null, null, null, null, null, null, ... 

を取得しますか?なぜ私はnullを持っていますか?あなたが名前のキー(24889)によってobjectsにアクセスすることはできませんので、あなたが事前に位置を知っていれば、あなたがより良い

mongoCollection.updateOne(eq("idKey", 2323),new Document("$set", new Document("objects.0."+innerKey+".key2", "val3"))); 

を試すことができます

+1

を使用しますが、いくつかの有効なJSONデータを貼り付けてくださいもらえますか?サンプルデータはエンティティのtoString()バージョンのように見えますか? – dnickless

+0

ありがとう、私は上記のjson形式を – AbtPst

+0

より上に追加しました。 – AbtPst

答えて

2

アプローチは、キーを含めるためにあなたの文書を更新することです。

{ 
    "_id": "59837be4324fb01040068109", 
    "idKey": 2323, 
    "objects": [ 
    { 
     "name": "24889", 
     "value": { 
     "key1": "val1", 
     "key2": "val2" 
     } 
    } 
    ] 
} 

ような何かとpositional operator

mongoCollection.updateOne(and(eq("idKey", 2323), eq("objects.name", innerKey)),set("objects.$.value.key2", "val3")); 

`

+1

"objects.0" + innerKey + ".key2"、 "val3"の数字0の後にドットがありません – dnickless

+0

ありがとう!それはうまくいった。ちょっと微妙な微調整では、私は 'Updates.set()' – AbtPst

+0

を途中で使用しなければなりませんでしたが、内部キーの値を得るための同様の方法がありますか?更新の代わりに、私は値を取得したいのですか?私はフィルタを 'find()'メソッドに入れてみましたが、いつも私に全文を与えました – AbtPst

関連する問題