长时间听众,第一次来电。
我正在使用节点驱动程序在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没有生效。
答案 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);