0

最近、POJOを、すべての型付きプロパティから、 contentという型付きJSONObjectフィールド内の無料のものに変更しました。

問題は、すべての古いドキュメントが古いPOJOバージョンにマップされるため、次のように保存されることです。

{"_id":"ObjectId(value)","field1":"value1","field2":"value2"}

単一のmongoコマンドを使用してすべてのフィールドを更新し、IDを除くすべてのコンテンツをラップできるようにすることで、結果は次のようになります。

{"_id":"ObjectId(value)","content":{"field1":"value1","field2":"value2"}}

それとも、1つずつ実行する簡単なプログラムをプログラムする必要がありますか?(すべての値を繰り返す場合のように、新しいコンテンツレベルを手動で追加します)

4

2 に答える 2

1

残念ながら、この方法でドキュメントを再構築できるMongoDBコマンドはありません。すべてのドキュメントを1つずつフェッチし、構造を更新してから、更新した構造をMongoDBに送り返すプログラムを作成する必要があります。

多くの場合、これを行うための最良の方法は、変更されたドキュメントを新しいコレクションに書き込み、完了したら古いコレクションを削除することです。

于 2012-07-05T17:51:21.130 に答える
1

mongoシェルを介して実行する.jsファイルを作成することで解決しました。

mongo myDb fixresults.js

ファイルは次のとおりです。

for( var c = db.results.find(); c.hasNext(); ) {
    var full = c.next();
    var anon = db.results.findOne({"_id":full._id},{"_id":0});
    var n = {"_id":full._id,"content":anon};
    db.results.temp.insert(n);
}

これにより、変換された値が.tempコレクションに挿入され、後で名前を変更して元の値を置き換えることができます。

于 2012-07-05T18:53:59.683 に答える