Mongoose批量更新/保存

时间:2017-02-10 15:27:35

标签: javascript node.js mongodb mongoose

我认为Model.collection.insertModel.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分钟以上的模式,如何才能提高性能?

1 个答案:

答案 0 :(得分:1)

你现在这样做的方法是在去另一个之前等待一件事被保存。您可以(完全或部分)并行化它以使其更快完成。

您可以使用async.map代替async.mapSeries来使其同时发挥作用。

或者您可以使用async.mapLimit来限制同时发生的操作次数。

请参阅:

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到你想要的任何数字。