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 中保存或查找文档

使用 es7 async/await 检查 mongodb 中是不是存在文档

MongoDB:查找没有子文档符合条件的文档

MongoDB:查找没有子文档符合条件的文档

MongoDB 增删改查

python进阶-MongoDB