我们为每个用户都有一份文档。我们会奖励他们完成活动的“橙子”(游戏内积分)。
我们像这样存储给出的点:
我们有他们的划时代时间和赚到的橙子。目前,我们已经掌握了构建历史排行榜的总体
totalOranges
。
但是,我们正在努力确定如何制作 24 小时/过去 7 天的排行榜。我们可以计算每个用户,但读取次数会很疯狂(10k+ 用户)。有更聪明的方法吗?
要基于动态键对对象进行计算,最简单的方法是使用
$objectToArray
将对象转换为数组格式,然后处理数组
我使用的步骤
$filter
数组以获取时间戳在最近 7(或 n)天内的元素数组。现在这是 $reduce
$reduce
可用于对数组求和。将总和保存在单独的字段中db.collection.aggregate([
{
$addFields: {
inbetweenTimePeriod: {
$reduce: {
input: {
$filter: {
input: { $objectToArray: "$sectional" },
as: "item",
cond: {
$gte: [
{ $toLong: "$$item.k" },
{
$divide: [ { $subtract: [ { $toLong: "$$NOW" }, 604800000 ] }, 1000 ]
//(epoch now in ms - 7days in ms) in seconds
}
]
}
}
},
initialValue: 0,
in: { $add: [ "$$value", "$$this.v" ] }
}
}
}
},
{ $sort: { inbetweenTimePeriod: -1 } }
])