【问题标题】:Mongodb How do I make this sorting of grabbing an individual players position function faster?Mongodb如何使这种抓取单个玩家位置的排序功能更快?
【发布时间】:2022-01-17 10:32:24
【问题描述】:

class User {
  constructor(doc) {
    this.username = doc.username;
    this.kills = doc.kills;
    this.deaths = doc.deaths;
  }
}

const res = await Calls.getAllUsers();

        const users = res.map((doc) => new User(doc));

        const sorted = users.sort((a, b) => b.kills - a.kills);

        const whereIam =
          sorted.indexOf(users.find((u) => u.username === latest_user)) + 1;

大家好,我正在整理玩家位置(击杀数)

他们会做 /stats 并且他们会根据最高击杀数获得一个位置 这需要超过 5 分钟才能确定玩家位置,每天制作 26,000 份文件和 2,000 份文件,有哪些步骤可以加快或改变?

【问题讨论】:

    标签: node.js mongodb mongoose monk


    【解决方案1】:

    在此特定场景中,您可以按照以下步骤操作:

    1. { username: 1 } 上创建索引
    2. { kills: -1 } 上创建索引
    3. find({ username: latest_user }查询得到这个用户的kills作为latest_user_kills
    4. 使用countDocuments({ kills: { $gt: latest_user_kills } }) 查询,以获取杀死数高于此 latest_user 的所有用户的计数
    5. 第 4 步的结果计数是该个人玩家的位置

    【讨论】:

      【解决方案2】:

      您希望获取所有用户,然后在内存中进行排序和搜索。随着您的数据集变得越来越大,这将占用更多的内存。

      所以第一个建议是让 Mongo 在您的查询中为您执行此操作。

      此外,由于 Mongo 将执行查询,因此您需要在 Mongo 中对用户名和终止字段进行索引。

      如果您希望所有用户都在内存中是有原因的,那么您可以考虑使用哈希表来帮助您查找用户,但是没有办法解决排序时间问题。确保您的排序使用了合理的算法(这本身就是一个完整的主题,但 Quicksort 是具有最佳平均性能的算法)。

      【讨论】:

        猜你喜欢
        • 2022-11-25
        • 2015-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多