2016-08-10 13 views
0

私は既存のドキュメントをコピーし、それに新しいobjectIDを与えて、新しく追加されたドキュメントのフィールドを更新したいと思います。mongodbドキュメントをコピーしてフィールドの値を更新する方法

現在、私はドキュメントのコレクションを取得してリストを反復し、次にinsertOneとupdateOneを使用して新しいドキュメントを挿入し、フィールド値を更新するために "find"を使用しています。しかし、更新されるフィールド値は、古いオブジェクトIDを持つドキュメントに属しているようです。そして私はフィールド値が新しいObjectIDが更新されたドキュメントに属することを望みます。

myDocList = collection.find(new Document("track", trackName)); 

for (Document document : myDocList) { 
    collection.insertOne(new Document(document)); 
    collection.updateOne(new Document("track", trackName), new Document("$set", new Document("track", newTrackName))); 
    System.out.println(document); 
} 

答えて

0

なぜなら、挿入する前に新しいドキュメントを変更しないでください。

for (Document document : myDocList) { 
    Document doc = new Document(document); 
    doc.setTrackName(newTrackName); // or doc.put("track", newTrackName); if your doc implements Map 
    collection.insertOne(doc); 
    System.out.println(document); 
} 

もちろん、updateOneメソッドは、最初に見つかったレコードをそのtrackNameで更新します。 ロジックを保存する必要がある場合は、挿入された新しいドキュメントのobjectIdを何とか保存する必要があります。そして、objectIdによってupdateオブジェクトを呼び出します。以下のような 何か:

for (Document document : myDocList) { 
    collection.insertOne(new Document(document)).getObjectId(); //save this value 
    //I don't know exactly which mongo driver do you use 
    collection.updateOne(new Document("_id", savedObjId), new Document("$set", new Document("track", newTrackName))); 
    System.out.println(document); 
} 
+0

は、私はあなたのコード例に従いますが、私は挿入された新しいドキュメントを見ることはできませんメートル。私はcurrentDocumentとnewDocumentのいくつかの値をチェックするためにデバッグトレースを実装しました。そして、私はnewDocumentとcurrentDocumentのSystem.out.printlnから正しいデータを持っているが、ドキュメントはdtabaseに挿入されていないことがわかります。 – bbq123

+0

あなたはどちらの例を使用しましたか?最初の場合:_id値をクリアしてください。 'doc.put(" _ id "、null);'または 'doc.remove(" _ id ");' – shure

関連する問題