mongodb
コレクションの一括更新を行う必要があります。_t
というフィールドを更新する110Mドキュメントがあります。エポックからの秒数は{$type : 1}
です。データベースの_t
をすべてISODate()
に変換する必要があります。大規模な一括更新MongoDB - forEach()ドキュメント
私は、スクリプト、このようなupdateDate.js
試してみました:
var bulkOps = [];
db.siteEvents.find({"_t": {"$exists": true, "$type": 1 }}).forEach(function (doc) {
var epoch = doc._t;
newDate = new ISODate(epoch * 1000);
bulkOps.push(
{
"updateOne": {
"filter": { "_id": doc._id } ,
"update": { "$set": { "_t": newDate } }
}
}
);
});
db.siteEvents.bulkWrite(bulkOps);
をしかし、私はしばらく走ったが、すべての更新をしなかった、このスクリプトmongo <connection details...> updateDate.js
を、走りました。参考として、このドキュメント・ページを使用して
、私は、この点になった:
var bulk = db.siteEvents.initializeUnorderedBulkOp();
bulk.find({ "_t": { $type : 1 } }).update({ $set: { <UNSURE HOW TO REFERENCE DOC HERE> } });
bulk.execute();
しかし、最初の1で、私はforEach()
にコールバック関数を持っているのに対し、私は、ドキュメントを参照するかどうかはわかりません。
助けてくれてありがとう、Jared。
スクリプトを実行したときにコンソールからログが取得されましたか?どのMongoDBのバージョンを使用していますか? – chridam
私は '3.2.7'を使用していますが、出力もログも出力しませんでしたが、明示的に何も記録しませんでした。 – Jared
すべての110M操作をまとめて格納するために 'bulkOps'をビルドすることはおそらく問題です。 1000要素になるたびに 'bulkWrite(bulkOps)'を呼び出して、それをクリアして1000を構築してください。 – JohnnyHK