当标志update
设置为true
时,我有以下流水线根据score
计算排名(排序):
const pipeline = [
{$match: {"score": {$gt: 0}, "update": true}},
{$setWindowFields: {sortBy: {"score": -1}, output: {"rank": {$denseRank: {}}}}},
{$merge: {into: "ranking"}}
];
await ranking_col.aggregate(pipeline).toArray();
我接下来要做的是在update
标志设置为false
时将rank
设置为0:
ranking_col.updateMany({"update": false}, {$set: {"rank": parseInt(0, 10)}});
我的其中一个文档是这样的:
{
"_id": "7dqe1kcA7R1YGjdwHsAkV83",
"score": 294,
"update": false,
"rank": 0,
}
我希望避免额外的updateMany
调用,并在管道内执行相同的调用.当时MongoDB的支持告诉我这样使用$addFields
标志:
const pipeline = [
{$match: {"score": {$gt: 0}, "update": true}},
{$setWindowFields: {sortBy: {"score": -1}, output: {"rank": {$denseRank: {}}}}},
{$addFields: {rank: {$cond: [{$eq: ['$update', false]},parseInt(0, 10),'$rank']}}},
{$merge: {into: "ranking"}}
];
这在我的阿特拉斯触发器中不起作用. 你能纠正我的语法吗?或者告诉我一个好的方法?