モンゴを使用すると、(forEach()
メソッドを使用して)検索クエリから返されたカーソルを繰り返すことによって、これを行うと、ループ内でコレクションを更新することができます。例:
db.centers.find({
"ghostBuster": { "$exists": true }
}).forEach(function(doc){
db.centers.update(
{ "_id": doc._id },
{
"$set": { "ectoplasm": doc.exoplasm },
"$unset": { "exoplasm": "" }
}
)
});
サーバーへの「前後」は、IOでコストがかかるため、最小化しようとします。
var ops = [];
db.centers.find({
"ghostBuster": { "$exists": true }
}).forEach(function(doc) {
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": {
"$set": { "ectoplasm": doc.exoplasm },
"$unset": { "exoplasm": "" }
}
}
});
if (ops.length === 1000) {
db.centers.bulkWrite(ops);
ops = [];
}
})
if (ops.length > 0) db.centers.bulkWrite(ops);
かのMongoDBの2.6.xと3.0.xのリリースのBulk operationsのこのバージョンを使用します:
一括で更新を行うには
bulkWrite()
方法を(MongoDBのバージョン3.2を使用している場合)を使用し
両方の場合のバルク操作APIは、処理するコレクション内の1000個のドキュメントごとに1回だけ要求を送信することで、サーバーのIO負荷を軽減するのに役立ちます。マングースと同等の場合
、あなたはnode.js.におけるバルクAPIの非同期な性質を処理するための約束を使用して次のようなものを実装することができます 根底にあるバルク・オペレーション・APIを使用するためには、マングースモデルから.collection
プロパティ経由でアクセスする必要があります。 APIを使用する前に、それはマングースの内部バッファリングシステムでは動作しませんので、マングースが本当に、まだ"initializeOrderedBulkOp()"
機能をサポートしていないので、成功したDBに接続するためにマングースのを待ちます。
var mongoose = require('mongoose'),
express = require('express'),
Promise = require('bluebird'),
Schema = mongoose.Schema;
function connect(uri, options){
return new Promise(function(resolve, reject){
mongoose.connect(uri, options, function(err){
if (err) return reject(err);
resolve(mongoose.connection);
});
});
}
var centerSchema = new Schema({
exoplasm: Number,
ghostBuster: Number,
time: Date
}, { collection: "centers" });
var Center = mongoose.model("Center", centerSchema);
/*
function bulkUpdate(Model){
return new Promise(function(resolve, reject){
var bulk = Model.collection.initializeUnorderedBulkOp(),
counter = 0;
Model.find({ "ghostBuster" : { "$exists": true } })
.lean().exec(function (err, docs) {
if (err) return reject(err);
docs.forEach(function (doc){
counter++;
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "ectoplasm": doc.exoplasm },
"$unset": { "exoplasm": "" }
});
if (counter % 500 == 0) {
bulk.execute(function(err, result) {
if (err) return reject(err);
bulk = Model.collection.initializeUnorderedBulkOp();
resolve(result);
});
}
});
if (counter % 500 != 0) {
bulkUpdateOps.execute(function(err, result) {
if (err) return reject(err);
resolve(result);
});
}
});
});
}
*/
function bulkUpdate(Model){
return new Promise(function(resolve, reject){
var ops = [],
collection = Model.collection;
Model.find({ "ghostBuster" : { "$exists": true } })
.lean().exec(function (err, docs) {
if (err) return reject(err);
docs.forEach(function (doc){
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": {
"$set": { "ectoplasm": doc.exoplasm },
"$unset": { "exoplasm": "" }
}
}
});
if (ops.length === 1000) {
collection.bulkWrite(ops, function(err, result) {
if (err) return reject(err);
ops = [];
resolve(result);
});
}
});
if (ops.length > 0) {
collection.bulkWrite(ops, function(err, result) {
if (err) return reject(err);
resolve(result);
});
}
});
});
}
connect('mongodb://localhost/test', {}).then(function(db){
bulkUpdate(Center).then(function(res){
console.log('Bulk update complete.', res);
}, function(err){
console.log('Bulk Error:', err);
db.close();
});
}, function(err){
console.log('DB Error:', err);
});