Mongodb mongo聚合管道的$out阶段未使用节点生效
长时间的听众,第一次打电话到这里 我使用节点驱动程序在mongo上执行聚合命令,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不会生效(即,不会创建新名称,但会执行回调)。几个月前,我正在重构一些东西,这在以前是可行的(节点驱
$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);