我在我的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
属性.