gpt4 book ai didi

node.js - 具有异步队列和 waterfall 的 Mongoose

转载 作者:可可西里 更新时间:2023-11-01 10:01:01 26 4
gpt4 key购买 nike

我的目标是通过 Mongoose 导入大量数据。作为新手,我无法通过异步的各种机制正确设置流量控制。很高兴有人能指出合适的解决方案。谢谢。

var async = require('async'),
mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/test');
var Cat = mongoose.model('Cat', { name: String });

// Imagine this is a huge array with a million items.
var content = ['aaa', 'bbb', 'ccc'];
var queries = [];
content.forEach(function(name) {
queries.push(function(cb) {
var obj = new Cat({ name: name });
obj.save(function(err) {
console.log("SAVED: " + name);
console.log(err);
});
return true;
});
});

// FAILED: async.parallel adds all content to db,
// but it would exhaust the resource with too many parallel tasks.
async.parallel(queries, function(err, result) {
if (err)
return console.log(err);
console.log(result);
});

// FAILED: save the first item but not the rest
async.waterfall(queries, function(err, result) {
if (err)
return console.log(err);
console.log(result);
});

// FAILED: same as async.waterfall, async.queue saves the first item only
var q = async.queue(function(name, cb) {
var obj = new Cat({ name: name });
obj.save(function(err) {
console.log("SAVED: " + name);
console.log(err);
});
})
q.push(content, function (err) {
console.log('finished processing queue');
});

最佳答案

我认为eachLimiteachSeries最适合您的情况:

var content = ['aaa', 'bbb', 'ccc'];
async.eachLimit(content, 10, function(name, done) {
var obj = new Cat({ name : name });
obj.save(done);
// if you want to print some status info, use this instead:
//
// obj.save(function(err) {
// console.log("SAVED: " + name);
// console.log(err);
// done(err);
// });
//
}, function(err) {
// handle any errors;
});

使用 eachLimit,您可以“并行”运行 X 数量的查询(在上面的示例中为 10 个)以在不耗尽资源的情况下加快速度。 eachSeries 将等待上一个保存,然后再继续下一个,因此一次有效地保存一个对象。

请注意,使用 each*,您不会得到一个包含(保存的)对象的列表(这是一种您对结果不感兴趣的即发即弃机制,禁止任何错误)。如果你最终想要一个已保存对象的列表,你可以使用等效的 map* 函数:mapLimitmapSeries .

关于node.js - 具有异步队列和 waterfall 的 Mongoose ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19395433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com