我有一些这样的文件:
{"title": "test1", sort: 1},
{"title": "test2", sort: 7},
{"title": "test3", sort: 5}
现在我想通过类似
previous value plus 10
的模式重新分配新值的排序字段值
我想要以下结果:
{"title": "test1", sort: 1},
{"title": "test2", sort: 21},
{"title": "test3", sort: 11}
对于很多文档,执行此操作的最佳方法和最佳性能是什么?
使用
$rank
的$setWindowFields
功能提供排名1、2、3等,这将基于现有的sort
值。
最终的新排序将是
(rank - 1) x 10 + 1
db.collection.aggregate([
{
$setWindowFields: {
sortBy: { sort: 1 },
"output": {
sort: { $rank: {} }
}
}
},
{
$set: {
sort: {
$add: [
1,
{
$multiply: [
{ $subtract: ["$sort", 1] },
10
]
}
]
}
}
}
])
备注:
1
,因此这将是sort
的第一个新值。sort
字段可以有多个具有相同值的文档,那么当存在平局时,某些排名将会跳过。如果您希望它们始终是连续的,请使用 $denseRank
而不是 $rank
。