当前位置: 首页 > 面试题库 >

依次遍历mongodb游标(在等待回调之前,移至下一个文档)

石正奇
2023-03-14
问题内容

使用mongoskin,我可以执行以下查询,该查询将返回游标:

myCollection.find({}, function(err, resultCursor) {
      resultCursor.each(function(err, result) {

      }
}

但是,我想为每个文档调用一些异步函数,并且仅在回调后再移动到光标的下一个项目(类似于async.js模块中的eachSeries结构)。例如:

myCollection.find({}, function(err, resultCursor) {
      resultCursor.each(function(err, result) {

            externalAsyncFunction(result, function(err) {
               //externalAsyncFunction completed - now want to move to next doc
            });

      }
}

我该怎么办?

谢谢

更新:

我不愿意使用它,toArray()因为这是一个大的批处理操作,并且结果可能无法一次性存储在内存中。


问题答案:

如果您不想使用toArray将所有结果加载到内存中,则可以使用游标进行迭代,如下所示。

myCollection.find({}, function(err, resultCursor) {
  function processItem(err, item) {
    if(item === null) {
      return; // All done!
    }

    externalAsyncFunction(item, function(err) {
      resultCursor.nextObject(processItem);
    });

  }

  resultCursor.nextObject(processItem);
}


 类似资料:
  • 问题内容: 我正在制作一个经常刷新数据的函数,而我的请求链存在问题。问题是我有一个运行异步请求的for循环,并且for循环将在请求完成之前完成。 如果我要运行此代码,它将显示: 我知道是什么问题。事实上,for循环不会等待请求完成。我不知道这是一种解决方法。有人有什么想法吗? 问题答案: 您需要异步库。 例如, 可以这样写: 异步中有很多方便的实用程序函数,这些函数使回调的使用变得更加容易。

  • 当接收事件时,Akka参与者将一次处理一条消息,直到请求完成后才移动到下一条消息。 例如: 这将调用doThing()并开始处理未来,但不会在处理下一条消息之前等待它完成--它将简单地以尽可能快的速度执行队列中的下一条消息。 实质上,Akka似乎认为“返回未来”是“完成处理”,并进入下一个消息。

  • 问题内容: 如何遍历例如从查询创建的隐式游标? 这是示例代码: 问题答案: 这是允许动态SQL的方法。您可以根据需要在代码中构建查询字符串(适用于有关SQL注入的常规警告)。

  • 问题内容: 说我有一个数组。如何一次迭代两个? 问题答案: 您可以使用称为stride(to :, by :)的进度循环,每n个元素对元素进行一次迭代: Xcode 8.3.2•Swift 3.1

  • 我使用的是Firebase Cloud Firestore,然而,我认为这可能更像是JavaScript异步与同步promise返回的问题。 我正在执行一个查询以从一个集合中获取ID,然后循环该查询的结果以根据该ID从另一个集合中查找单个记录。 我怎么能等到forEach完成后才从外部promise和外部函数本身返回呢?