我有一堆表示一场比赛中得分的文件.我想按用户ID对分数进行分组并求和,但有一个问题:可以得负分,但累加和不应该低于零.因此,例如,如果用户1按此顺序获得以下分数:
1
2
-5
3
那么他们的最终分数应该是3
分,因为-5
分只会让他们的总分降到0,而不是-2
分.
我有这个聚合管道,据我所知,它正确地实现了这一点:
[
{
$sort: {
earnedDate: 1,
},
},
{
$group: {
_id: '$userId',
pointDeltas: {
$push: '$points',
},
userId: {
$first: '$userId',
},
},
},
{
$project: {
userId: 1,
points: {
$reduce: {
input: '$pointDeltas',
initialValue: 0,
in: {
$max: [
0,
{
$add: ['$$value', '$$this'],
},
],
},
},
},
},
}
]
这取决于points
是否以正确的顺序被推到pointDeltas
上(earnedDate
,升序).
从实验上看,这种情况似乎确实发生了.但这是有保证的吗?
我注意到$first
个运算符状态的official documentation:
返回每个组的第一个文档中的值.只有在对文档进行排序的情况下才定义顺序.
这似乎是在暗示文档是按顺序处理的,尽管这一原则是否也适用于使用$push
还不是$push
%清楚.同一页上的$push
的文档没有类似的注释.
这种行为是肯定的还是巧合的?无论哪种方式,我都找不到任何防弹的答案.