我有一个非常大的MongoDB,我需要更新,所以我写了一个javascript的事情来做:
for (var i = 0; i < 1000000; i++) {
db.test.update(
{foo_field: dataArray1[i]},
{$set: { bar_field: dataArray2[i]}},
{upsert:false}
)
}
Run Code Online (Sandbox Code Playgroud)
我担心这个脚本会在很短的时间间隔内执行太多的写操作,并且会降低数据库的性能,所以我想根据复制延迟对速率进行限速.
但是,我找不到强制脚本睡眠或等待一定数量毫秒的方法.它抱怨setInterval和setTImeout,说它们"未定义".这在Mongo有可能吗?
如果您使用MongoDB shell进行更新,则setInterval和setTimeout都不起作用.MongoDB shell确实有sleep功能,所以你可以添加这一行
// sleep 100ms after 1000 records inserted
if(1000 === counter) {
sleep(100);
counter = 0;
}
else {
counter++;
}
Run Code Online (Sandbox Code Playgroud)
将此行与记录计数器结合使用,例如在插入每1000条记录后休眠100毫秒.上面的代码并不会阻塞服务器.
不要与服务器命令Sleep - MongoDB Manual 3.0混淆
无论如何,我不会太担心MongoDB无法处理插入.您可以使用{w:1}作为写入问题,以确保返回游标.最后,据我所知,MongoDB shell不是异步的,这意味着它不会同时触发100,000个调用,而是按顺序触发.然而,NodeJS mongo驱动程序是异步的,因此可以使用let say async.js来控制数据流 - 例如,一次批量插入1000个,具有1-2个工作程序.
您可能想研究一下 Bulk API。这将使您可以在一次更新中完成所有操作,而无需限制循环。
var MongoClient = require('mongodb').MongoClient
MongoClient.connect('mongodb://127.0.0.1:27017/test', function (err, db) {
if(err){
console.log("DB ERR: " + err);
process.exit();
}else{
console.log("CONNECTED!!");
}
var batch = db.collection("test").initializeUnorderedBulkOp({useLegacyOps: true});
for (var i = 0; i < 5000; i++) {
var query = {foo_field: "foo_" + i };
batch.find(query).upsert().updateOne({$set: {foo: "bar_" + i}});
}
// updates batch of 5000 in one db call
batch.execute(function(batchErr, result) {
if(err){
console.log("BATCH ERR:" , batchErr);
}
if(result){
console.log("BATCH RESULT:", result);
}
db.close();
});
});
Run Code Online (Sandbox Code Playgroud)
> db.test.find().sort({_id:-1}).limit(4)
{ "_id" : ObjectId("5629a60d028bb6308940dc67"), "foo_field" : "foo_4999", "foo" : "bar_4999" }
{ "_id" : ObjectId("5629a60d028bb6308940dc66"), "foo_field" : "foo_4998", "foo" : "bar_4998" }
{ "_id" : ObjectId("5629a60d028bb6308940dc65"), "foo_field" : "foo_4997", "foo" : "bar_4997" }
{ "_id" : ObjectId("5629a60d028bb6308940dc64"), "foo_field" : "foo_4996", "foo" : "bar_4996" }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1141 次 |
| 最近记录: |