gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:43:41 25 4
gpt4 key购买 nike

长期倾听,第一次来访。

我正在使用节点驱动程序在 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 与回调,但如果我使用链接的 close() 它不会生效,结果又回到 AggregationCursor:

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

通读一些 responses对于问题,似乎 AggregationCursor vs Resulting Documents 是预期的。但是我不明白为什么当我进入回调或链关闭()时 $out 没有生效。

  • mongo 3.6.2 inside the mongo:latest docker image
  • 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);

关于mongodb - mongo 聚合管道的 $out 阶段未使用节点生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48666648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com