【发布时间】:2014-03-30 09:09:00
【问题描述】:
这可能是一个简单的答案,但我对异步编程相对较新,我正在寻找能够为我指明正确方向的人。
我的问题是 - 从名称数组中查找或创建多个文档(我正在使用 Mongoose)然后返回 _id 数组的最佳方法是什么?
所以说清楚,我想:
- 给定一组名称,查找或创建一个包含每个名称的文档
- 返回现有或新创建的文档_ids的数组
【问题讨论】:
标签: node.js mongodb asynchronous callback mongoose
这可能是一个简单的答案,但我对异步编程相对较新,我正在寻找能够为我指明正确方向的人。
我的问题是 - 从名称数组中查找或创建多个文档(我正在使用 Mongoose)然后返回 _id 数组的最佳方法是什么?
所以说清楚,我想:
【问题讨论】:
标签: node.js mongodb asynchronous callback mongoose
您可以使用 async 模块,并在其中使用 async.parallel() 方法 - https://github.com/caolan/async#quick-examples
async.parallel([
function(){ ... },
function(){ ... }
], callback);
或者您可以使用 promises 然后 Q.all() 来获取 ids 数组 - https://github.com/kriskowal/q#combination
Q.all(arrayOfFindOps).then(function(rows) {
return _.pluck(rows, '_id')
}
如果您不想使用上述任何方法并使用回调来执行此操作,那么您必须跟踪数组长度的计数,继续将 id 添加到数组中,并且当您的完成计数器达到数组长度时,用你创建的数组调用另一个函数。
【讨论】:
可以轻松修改此代码以满足您的要求。为每个需要创建的文档(如果不存在)调用此函数。
function(req, reply) {
// return document. if not found, create docuemnt.
docModel.findOne( {'name': req.params.name}, function ( err , doc) {
if(err){
//handle error
}
if(doc===null){
//find failed, time to create.
doc = new docModel( {'name': req.params.name} );
doc.save(function(err){
if(err){
//handle error
}
});
}
return reply(user._id);
});
}
【讨论】: