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

Mongodb mongo聚合管道的$out阶段未使用节点生效,mongodb,mongodb-query,aggregation-framework,node-mongodb-native,Mongodb,Mongodb Query,Aggregation Framework,Node Mongodb Native,长时间的听众,第一次打电话到这里 我使用节点驱动程序在mongo上执行聚合命令,$out阶段似乎只有在链接了某些方法的情况下才会生效 我想调用aggregate(),将$out作为管道的最后一个阶段,然后进行回调。目前,它仅在我链接next()或toArray()时起作用,这是一个令人讨厌的问题,因为它是聚合的(管道、选项、回调) 为了清楚起见,下面的示例进行了简化 在这里,我使用回调,而$out不会生效(即,不会创建新名称,但会执行回调)。几个月前,我正在重构一些东西,这在以前是可行的(节点驱

长时间的听众,第一次打电话到这里

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

我想调用
aggregate()
,将$out作为管道的最后一个阶段,然后进行回调。目前,它仅在我链接
next()
toArray()
时起作用,这是一个令人讨厌的问题,因为它是聚合的(管道、选项、回调

为了清楚起见,下面的示例进行了简化

在这里,我使用回调,而$out不会生效(即,不会创建新名称,但会执行回调)。几个月前,我正在重构一些东西,这在以前是可行的(节点驱动程序的版本2.2.33):

如果我不添加回调,而是添加chain 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();
  });
所以我想我一定是误解了承诺与回调,但如果我使用close()这两种方法都是链接的,并且结果返回到AggregationCursor,那么它就不会生效:

db.collection('names')
  .aggregate([
    { $match: {} },
    { $limit: 1 },
    { $out: 'newNames' }
  ])
  .close((err, result) => {
    // result is an AggregationCursor
    callback();
  });
通读一些to问题,似乎可以预期AggregationCursor与结果文档的对比。但我不明白为什么$out在我转到回调或链关闭()时不生效

  • mongo 3.6.2 mongo内部:最新docker图像
  • Docker 17.12.0
  • 节点8.9.0

    • 我自己也遇到了这个问题。我调用了cursor.next(),直到收到null并且$out聚合起作用。使用async/await可以简化这一过程。如果没有这些,看起来会很乱

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