mongo聚合管道的$ out阶段未使用节点

时间:2018-02-07 14:48:34

标签: mongodb mongodb-query aggregation-framework node-mongodb-native

长时间听众,第一次来电。

我正在使用节点驱动程序在mongo上执行聚合命令,而$out阶段似乎只有在链接某些方法时才会生效。

我想用$ out作为管道的最后一个阶段调用aggregate()然后回调。目前,只有当我next()toArray()链接时才会有效,因为method signature是汇总的(管道,选项,回调)。

为清晰起见,下面简化了示例。

这里,我使用回调并且$ out不生效(即不创建newNames但执行回调)。几个月前我正在重构这些东西,这是以前工作的(节点驱动程序的2.2.33版本):

db.collection('names')
  .aggregate([
    { $match: {} }, 
    { $limit: 1 },
    { $out: 'newNames' }
  ], (err, result) => {
    // result is an AggregationCursor
    callback();
  });

如果我不添加回调而是链接next(),那么$ out阶段将生效

db.collection('names')
  .aggregate([
    { $match: {} },
    { $limit: 1 },
    { $out: 'newNames' }
  ])
  .next((err, result) => {
    // result is null, why?
    callback();
  });

如果你链接到阵列也可以工作:

db.collection('names')
  .aggregate([
    { $match: {} }, 
    { $limit: 1 },
    { $out: 'newNames' }
  ])
  .toArray((err, result) => {
    // result is an empty array (i.e. the resulting docs), OK, makes sense
    callback();
  });

所以我认为我必须误解Promises vs callbacks,但是如果我使用close()来链接并且结果又回到AggregationCursor它就不会生效:

db.collection('names')
  .aggregate([
    { $match: {} },
    { $limit: 1 },
    { $out: 'newNames' }
  ])
  .close((err, result) => {
    // result is an AggregationCursor
    callback();
  });

通过阅读一些responses问题,预计会出现AggregationCursor与Resulting Documents。但是我不明白为什么当我去回调或链接close()时$ out没有生效。

  • mongo 3.6.2在mongo内:最新的docker image
  • Docker 17.12.0
  • node 8.9.0

1 个答案:

答案 0 :(得分:1)

我自己也遇到了这个问题。我调用了cursor.next(),直到接收到null并且$ out聚合起作用为止。使用异步/等待使这变得容易。没有这些,这看起来会很凌乱。

var cursor = await db.collection('names')
  .aggregate([
    { $match: {} },
    { $limit: 1 },
    { $out: 'newNames' }
  ]);

var next = null;
do {
   next = await cursor.next();
} while (next != null);