mongoose批量更新/保存
我读了Model.collection.insert
比Model.create
快。
我在User.collection中有1kk用户,我想每1分钟更新一次:这是我的代码:
const mongoose = require('mongoose'); const User = require('./models/user'); const async = require('async'); function getRandomArbitrary(min, max) { return Math.round(Math.random() * (max - min) + min); } User.find({}, (err, docs) => { async.mapSeries(docs, (doc, callback) => { doc.value = getRandomArbitrary(0,100); doc.save((err) => { callback(err, doc); }); }, (err, result) => { if (err) return err; console.log('completed'); }); });
这是完成这个的好方法吗? 它需要1分钟以上的模式,如何提高性能?
你现在这样做的方式是等待一个事情被保存之前,去另一个。 您可以并行(完全或部分),使其更快完成。
您可以使用async.map
而不是async.mapSeries
使其并行工作。
或者,您可以使用async.mapLimit
来限制同时进行的操作的数量。
看到:
- https://caolan.github.io/async/docs.html#map
- https://caolan.github.io/async/docs.html#mapLimit
- https://caolan.github.io/async/docs.html#mapSeries
async.map
示例:
User.find({}, (err, docs) => { async.map(docs, (doc, callback) => { doc.value = getRandomArbitrary(0,100); doc.save((err) => { callback(err, doc); }); }, (err, result) => { if (err) return err; console.log('completed'); }); });
async.mapLimit
示例:
const LIMIT = 10; User.find({}, (err, docs) => { async.mapLimit(docs, LIMIT, (doc, callback) => { doc.value = getRandomArbitrary(0,100); doc.save((err) => { callback(err, doc); }); }, (err, result) => { if (err) return err; console.log('completed'); }); });
只要LIMIT
到任何你想要的数字。