2013-05-17 16 views
9

MongoDBコレクションのスキーマを変更しようとしています。 (私は文字列として日付を格納していましたが、今ではアプリケーションにISODateという名前が格納されています;古いレコードをすべて変更してISODateを使用するように変更する必要があります)。私は更新を使用してこれを行う方法を知っていると思いますしかし、この操作は何万レコードにも影響するため、私は100%確実ではない操作を実行することを躊躇しています。少数のレコード、元のレコード、そしてそれがどのように変更されるのかを私に示す更新プログラムの「ドライラン」を行う方法はありますか?アップデート操作の「ドライラン」を実行する方法はありますか?


編集:私は、各レコードに新しいフィールドを追加する、とのアプローチを使用して終了元に一致するように、そのフィールドの名前を変更(データが正しかったことを確認した後)。 ISODate sまでの文字列時間を変換するための方法が働くことになった何だったこと、ところで

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}) 

:それはこのように見えました。 (私はthis SO answerからアイディアを得ました)

+1

私の助言は、新しいフィールドとしてISODateを追加することです。一度すべてが良く見えたら、文字列の日付を設定解除することができます。 –

+0

@JamesWahlin私はこれをしない乾いた実行をサポートするSQLの中でも、正しいアイデアを持っています – Sammaye

+0

@JamesWahlin答えとしてあなたのコメントを追加できますか? – bdesham

答えて

3

私のアドバイスは、新しいフィールドとしてISODateを追加することです。一度すべてが良く見えたら、文字列の日付を設定解除することができます。

4

データベース環境でテスト環境を作成してください。少数のレコードをコピーしてください。問題が解決しました。あなたが探していた解決策ではないと確信しています。しかし、私は、これが「テスト環境」が使用されるべき厳密な状況だと信じています。

+0

私はそれを考えました。しかし、私の最初の試みがうまくいかない場合は、開発環境をクリアしてデータを再インポートする必要があります。これは避けがたい面倒なようでした。 – bdesham

+0

ええ、私はそれが考えられていたと思っていましたが、とにかくそこに提案を投げかけていると思っていました...私はときには、時には簡単なものを見落とすことがあります。 – eidsonator

2

監視する特定のレコードのIDを選択します。 update{_id:{$in:[<your monitored id>]}}

+0

これは1つのアプローチですが、更新操作を壊すとデータが破壊される可能性があります。 – bdesham

+2

@bdeshamバックアップなしでライブデータを実験するのは悪い習慣です。プロダクション操作のための親指ルールです。ロールバックポイントを最初に作成します – Dewfy

0

オーバーヘッドの量に依存するもう1つのオプションは、あなたを引き起こします。 保存操作がコメントアウトされている間、スクリプトの作成、検索操作の実行、出力の追加、またはデバッグの実行を検討できます。確信が得られたら、保存操作を適用できます。

var changesLog = []; 
var errorsLog = []; 
events.find({timestamp: {$type: 2}}, function (err, events) { 
    if (err) { 
     debugger; 
     throw err; 
    } else { 
     for (var i = 0; i < events.length; i++) { 
      console.log('events' + i +"/"+(candidates.length-1)); 
      var currentEvent = events[i]; 
      var shouldUpdateCandidateData = false; 

      currentEvent.timestamp = new ISODate(currentEvent.timestamp); 


      var change = currentEvent._id; 
      changesLog.push(change); 

      // // ** Dry Run ** 
      //  currentEvent.save(function (err) { 
      //   if (err) { 
      //    debugger; 
      //    errorsLog.push(currentEvent._id + ", " + currentEvent.timeStamp + ', ' + err); 
      //    throw err; 
      //   } 
      //  }); 
     } 
     console.log('Done'); 
     console.log('Changes:'); 
     console.log(changesLog); 
     console.log('Errors:'); 
     console.log(errorsLog); 
     return; 
    } 
}); 
関連する問題