聚合游标


AggregationCursor()

参数
  • agg «Aggregate»
继承

聚合游标是用于一次处理一个聚合结果的并发原语。它类似于 QueryCursor。

聚合游标除了几种其他机制之外,还实现了 Node.js streams3 API,用于一次从 MongoDB 加载一个文档。

创建聚合游标会执行模型的预聚合钩子,但不会执行模型的后期聚合钩子。

除非你是高级用户,否则不要直接实例化此类。使用 Aggregate#cursor() 代替。


AggregationCursor.prototype.addCursorFlag()

参数
  • flag «String»
  • value «Boolean»
返回
  • «AggregationCursor» this

添加 游标标志。对于设置 noCursorTimeouttailable 标志很有用。


AggregationCursor.prototype.close()

参数
  • callback «Function»
返回
  • «Promise»

将此游标标记为已关闭。将停止流式传输,后续对 next() 的调用将出错。


AggregationCursor.prototype.eachAsync()

参数
  • fn «Function»
  • [options] «Object»
    • [options.parallel] «Number» 并发执行的 promise 数量。默认为 1。

    • [options.batchSize=null] «Number» 如果设置,Mongoose 将使用最多 batchSize 个文档的数组调用 fn,而不是单个文档

    • [options.continueOnError=false] «Boolean» 如果为 true,eachAsync() 会遍历所有文档,即使 fn 抛出错误。如果为 false,eachAsync() 会立即抛出错误,如果给定函数 fn() 抛出错误。

返回
  • «Promise»

对游标中的每个文档执行 fn。如果 fn 返回一个 promise,则会等待 promise 解决,然后继续迭代下一个。返回一个在完成后解决的 promise。


AggregationCursor.prototype.map()

参数
  • fn «Function»
返回
  • «AggregationCursor»

注册一个转换函数,该函数随后会映射通过流式接口或 .next() 检索到的文档

示例

// Map documents returned by `data` events
Thing.
  find({ name: /^hello/ }).
  cursor().
  map(function (doc) {
   doc.foo = "bar";
   return doc;
  })
  on('data', function(doc) { console.log(doc.foo); });

// Or map documents returned by `.next()`
const cursor = Thing.find({ name: /^hello/ }).
  cursor().
  map(function (doc) {
    doc.foo = "bar";
    return doc;
  });
cursor.next(function(error, doc) {
  console.log(doc.foo);
});

AggregationCursor.prototype.next()

返回
  • «Promise»

从此游标获取下一个文档。如果不再有文档,将返回 null


AggregationCursor.prototype[Symbol.asyncIterator]()

返回一个用于 for/await/of 循环 的异步迭代器。您无需显式调用此函数,JavaScript 运行时将为您调用它。

示例

// Async iterator without explicitly calling `cursor()`. Mongoose still
// creates an AggregationCursor instance internally.
const agg = Model.aggregate([{ $match: { age: { $gte: 25 } } }]);
for await (const doc of agg) {
  console.log(doc.name);
}

// You can also use an AggregationCursor instance for async iteration
const cursor = Model.aggregate([{ $match: { age: { $gte: 25 } } }]).cursor();
for await (const doc of cursor) {
  console.log(doc.name);
}

Node.js 10.x 本机支持异步迭代器,无需任何标志。您可以使用 --harmony_async_iteration 标志 在 Node.js 8.x 中启用异步迭代器。

注意:如果 Symbol.asyncIterator 未定义,则不会设置此函数。如果 Symbol.asyncIterator 未定义,则意味着您的 Node.js 版本不支持异步迭代器。