【问题标题】:MongoDB Async - Find or create docs; return array of themMongoDB Async - 查找或创建文档;返回它们的数组
【发布时间】:2014-03-30 09:09:00
【问题描述】:

这可能是一个简单的答案,但我对异步编程相对较新,我正在寻找能够为我指明正确方向的人。

我的问题是 - 从名称数组中查找或创建多个文档(我正在使用 Mongoose)然后返回 _id 数组的最佳方法是什么?

所以说清楚,我想:

  1. 给定一组名称,查找或创建一个包含每个名称的文档
  2. 返回现有或新创建的文档_ids的数组

【问题讨论】:

    标签: node.js mongodb asynchronous callback mongoose


    【解决方案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);
          });
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 2013-10-04
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多