我在我的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相关问答推荐

如何在node.js中以随机顺序调用函数并按顺序操作

编辑Mongoose中的对象嵌套数组

MongoDB上的updateOne和findOneAndUpdate在Node.js中无法正常工作

(0,core_1.default)不是使用@middy/core的lambda处理程序上的函数

Inno Setup如何在现有文本文件中追加新内容

将 POST 的 json 变量格式化为 lambda

我如何在nodejs中的路由之间交换令牌

如何在 Firestore 函数上使用类型模型来获取字段值

MongoDB - 查找查询以判断是否存在少量字段,结合字段上的 AND

如何解决 npm install react-select failure with error : An unknown git error occurred, git@github.com :Permission denied (publickey)

nuxt:在 docker 镜像中找不到

响应发送 200 而不是 403

如何正确使用 package.json 中的关键字属性?

使用 node.js 执行一个 exe 文件

添加git信息到create-react-app

如何判断MongoDB本机nodejs驱动程序中是否存在集合?

使用 gzip/deflate 压缩的简单 HTTP 请求

Google Firebase 错误(函数返回未定义、预期的 Promise 或值)

如何创建安全(TLS/SSL)Websocket 服务器

CORS 错误:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段授权