23

MongoDB コレクションの 1 つのスキーマを変更中です。(私は日付を文字列として保存していましたが、現在はアプリケーションがそれらをISODates として保存しています。古いレコードもすべてISODates を使用するように変更する必要があります。) 更新を使用してこれを行う方法はわかっていると思いますが、この操作は何万ものレコードに影響を与えるため、100% うまくいくとは限らない操作を発行することをためらっています。少数のレコードについて、元のレコードとそれがどのように変更されるかを示す更新の「予行演習」を行う方法はありますか?


編集:各レコードに新しいフィールドを追加し、(データが正しいことを確認した後)そのフィールドの名前を元のフィールドと一致するように変更するというアプローチを使用することになりました。次のように見えました。

db.events.find({timestamp: {$type: 2}})
    .forEach( function (e) {
        e.newTimestamp = new ISODate(e.timestamp);
        db.events.save(e);
    } )

db.events.update({},
    {$rename: {'newTimestamp': 'timestamp'}},
    {multi: true})

ちなみに、文字列の時間をISODates に変換するその方法は、最終的に機能しました。(私はこのSOの答えからアイデアを得ました。)

4

4 に答える 4