在 Node.JS 和 MongoDB 中构建有时限的排行榜

问题描述 投票:0回答:1

enter image description here

我们为每个用户都有一份文档。我们会奖励他们完成活动的“橙子”(游戏内积分)。

我们像这样存储给出的点:

enter image description here

我们有他们的划时代时间和赚到的橙子。目前,我们已经掌握了构建历史排行榜的总体

totalOranges

但是,我们正在努力确定如何制作 24 小时/过去 7 天的排行榜。我们可以计算每个用户,但读取次数会很疯狂(10k+ 用户)。有更聪明的方法吗?

node.js mongodb mongoose
1个回答
1
投票

要基于动态键对对象进行计算,最简单的方法是使用

$objectToArray
将对象转换为数组格式,然后处理数组

我使用的步骤

  1. 将对象字段转换为数组,然后
    $filter
    数组以获取时间戳在最近 7(或 n)天内的元素数组。现在这是
    $reduce
  2. 的输入数组
  3. $reduce
    可用于对数组求和。将总和保存在单独的字段中
  4. 按新字段排序
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 } }
])

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.