我在我的Atlas触发器中用NodeJS编写了这个聚合管道:

  const pipeline = [
    {$match: {"score": {$gt: 0}, "update": true}},
    {$setWindowFields: {sortBy: {"score": -1}, output: {"rank": {$denseRank: {}}}}},
    {$merge: {into: "ranking"}}
  ];
  
  await ranking_col.aggregate(pipeline);

我首先用Python语言编写了这个管道以进行测试,它工作得很好:

self.db.ranking.aggregate([
            {
                "$match": {
                    "score": {"$gt": 0},
                    "update": True
                }
            },
            {
                '$setWindowFields': {
                    'sortBy': {'score': -1},
                    'output': {
                        'rank': {
                            '$denseRank': {

                            }
                        }
                    }
                }
            },
            {
                "$merge": {
                    "into": "ranking"
                }
            }
        ])

我在触发器日志(log)中没有错误,但似乎只是没有执行管道,因为它应该修改排名,就像它在Python中所做的那样.

你能告诉我我做错了什么吗?

编辑:数据库方案(就像查询一样简单)

见下面一份ranking_col分的文件:

{
  "_id": "7dqe1kcA7R1YGjdwHsAkV83",
  "score": 294,
  "update": false,
  "rank": 0,
}

这里的聚合只是为了根据score计算rank属性.

推荐答案

好的,所以问题在于函数在atlas上使用的Mongo驱动程序以及您对它的理解.

aggregate返回AggregateCursor,这意味着在您触发它之前不会实际执行任何命令,这意味着您的触发器实际上运行良好,但因为没有人使用光标,所以它只是退出函数而不做任何事情.

一个非常简单的解决方案是只需添加.toArray(),这将把光标转换为一个文档array.实质上触发了以下功能:

await ranking_col.aggregate(pipeline).toArray();

Node.js相关问答推荐

NodeJS缓冲区大小逻辑:为什么默认是8KB,而不仅仅是数据大小?

从mongodb集合中获取每分钟数据的每小时数据

我收到警告:发现函数rs-ms-v1不受支持的运行时nodejs18.x× 不受支持的运行时

Axios TypeError:将循环 struct 转换为 JSON

运行本地移动自动化测试时,在onPrepare钩子中,ERROR @wdio/cli:utils: A service failed in the 'onPrepare'

为什么这个 module.export 函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作

nyc 代码覆盖不适用于 NodeJs Express 服务器

我如何在 Raku 的供应中注册不同的事件?

如何在 Docker 容器中 SSO 登录 AWS(使用 aws-sdk v3)

BrowserRouter 无法渲染组件

如何使用填充在mongoose 上保存新数据

Express.js cookie setter 的 Domain 属性:如何与 *多个 * 域共享 cookie?

使用 Forms API 进行批量更新时生成 itemId

如何使用来自前一阶段的另一个数组的聚合mongoose 在数组中添加字段

使用服务帐户将 Firebase 应用程序部署到 Heroku(使用 dotenv 的环境变量)

为什么 JavaScript 的 parseInt(0.0000005) 打印5?

Node.js 17.0.1 Gatsby 错误-数字信封 routine ::不支持 ... ERR_OSSL_EVP_UNSUPPORTED

使用 Monit 而不是基本的 Upstart 设置有什么好处?

在 Node.js 上使用 Connect 无法获取 /

我无法全局安装 nodemon,nodemon无法识别