Jie*_*eng 7 synchronization mongoose mongodb
如何在Mongoose中管理批量保存?我看到它可能还不可能:
有人提到使用一些流量控制库q,但我也注意到mongoose中的承诺,可以使用吗?我可以在jQuery Deferred/Promises中做
$.when(obj1.save(), obj2.save(), obj3.save()).then ->
# do something?
Run Code Online (Sandbox Code Playgroud)
是的,你可以用承诺做到这一点.如果你使用Q promise库,你可以重写@matz3的代码,如:
var tasks = [];
for (var i=0; i < docs.length; i++) {
tasks.push(docs[i].save());
}
Q.all(tasks)
.then(function(results) {
console.log(results);
}, function (err) {
console.log(err);
});
Run Code Online (Sandbox Code Playgroud)
我们在循环中一次启动所有操作,但我们不等待它们中的任何一个完成,因此它们并行运行.我们向数组添加一个promise(对结果来说就像占位符一样).然后,我们等待承诺数组中的所有承诺完成.
大多数优秀的Promises/A +兼容库都有一些等价的Q.all
猫鼬现在允许您选择哪个Promise实现。
在这里,我使用的是Node.js中默认的Promise(ES6)系统
var mongoose = require('mongoose');
mongoose.Promise = global.Promise; // use system implementation
Promise.all(obj1.save(), obj2.save(), obj3.save())
.then(function(resultSaves) {
console.log('parallel promise save result :');
console.log(resultSaves);
mongoose.disconnect();
}).catch(function(err) {
console.log('ERROR on promise save :');
console.log(err);
mongoose.disconnect();
});
Run Code Online (Sandbox Code Playgroud)
节点-版本v4.1.1
猫鼬@ 4.1.8
由于mongoose现在支持您可以使用的承诺Promise.all().then(),因此当所有承诺都得到解决时它将返回。
Promise.all([
obj1.save(),
obj2.save(),
obj3.save()
])
.then(console.log)
.catch(console.error)
Run Code Online (Sandbox Code Playgroud)
事实上,如果您总是调用该save()方法,则可以在Array.map()此处使用:
Promise.all([ obj1, obj2, obj3 ].map( obj => obj.save() )
Run Code Online (Sandbox Code Playgroud)
Aaand 还使用 es6 语法来解构结果数组:
Promise.all([ obj1, obj2, obj3 ].map( obj => obj.save() )
.then( ([ savedObj1, savedObj2, savedObj3 ]) => {
// do something with your saved objects...
})
Run Code Online (Sandbox Code Playgroud)
小智 3
var functions = [];
for (var i=0; i < docs.length; i++) {
functions.push((function(doc) {
return function(callback) {
doc.save(callback);
};
})(docs[i]));
}
async.parallel(functions, function(err, results) {
console.log(err);
console.log(results);
});
Run Code Online (Sandbox Code Playgroud)