MongoDB Async - 查找或创建文档;返回它们的数组
Posted
技术标签:
【中文标题】MongoDB Async - 查找或创建文档;返回它们的数组【英文标题】:MongoDB Async - Find or create docs; return array of them 【发布时间】:2014-03-30 09:09:00 【问题描述】:这可能是一个简单的答案,但我对异步编程相对较新,我正在寻找能够为我指明正确方向的人。
我的问题是 - 从名称数组中查找或创建多个文档(我正在使用 Mongoose)然后返回 _id 数组的最佳方法是什么?
所以说清楚,我想:
-
给定一组名称,查找或创建一个包含每个名称的文档
返回现有或新创建的文档_ids的数组
【问题讨论】:
【参考方案1】:您可以使用 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 添加到数组中,并且当您的完成计数器达到数组长度时,用你创建的数组调用另一个函数。
【讨论】:
感谢您的回复。我最终只使用回调并跟踪我的数组长度;)期待在未来使用 async 和 Promises。【参考方案2】:可以轻松修改此代码以满足您的要求。为每个需要创建的文档(如果不存在)调用此函数。
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);
);
【讨论】:
以上是关于MongoDB Async - 查找或创建文档;返回它们的数组的主要内容,如果未能解决你的问题,请参考以下文章
我无法使用 Mongoose 在 MongoDB 中保存或查找文档