【问题标题】:Multiple Schemas in a MongoDB (using Mongoose)MongoDB 中的多个模式(使用 Mongoose)
【发布时间】:2013-04-07 22:57:45
【问题描述】:

我正在使用 MongoDB、Mongoose 和 Node 来存储游戏的用户信息。

我有一种情况,我希望获得两套游戏记录: 1. 用户 2. 排行榜

用户信息包括用户名、密码、游戏次数和用户的前 5 名得分。我目前为此设置了一个架构,它可以完美运行。

我现在被要求添加一个排行榜,它应该显示所有用户的前 10 名总得分。我想在同一个数据库中为此设置单独的记录,以避免检查所有用户记录并过滤以显示排行榜。我宁愿将排行榜集合限制为 10 条记录,并且每次用户完成游戏时,对照该集合检查他们的分数,看看他们是否应该在排行榜上。我是 mongo/mongoose 的新手,不知道如何最好地解决这个问题。

任何建议将不胜感激。

我确信这是其他人过去遇到过的问题,如果这里已经涉及到,我深表歉意,但我已经搜索并找不到类似的东西。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您不需要其他集合来执行此操作。您可以通过 MongoDB 中的查询完美地做到这一点。

    假设我插入了以下内容:

    db.user.insert({ name: 'foo', scores: [100, 80, 90, 60, 65] });
    db.user.insert({ name: 'bar', scores: [95, 120, 83, 70, 42] });
    db.user.insert({ name: 'baz', scores: [180, 160, 95, 100, 77] });
    

    现在,假设要获得该系列中的前 10 款游戏,您需要执行以下操作:

    db.user.aggregate([
      { $project: { name: 1, scores: 1 } },
      { $unwind: "$scores" },
      { $sort: { scores: -1, name: 1 } },
      { $limit: 10 }
    ])
    

    请记住,aggregate 是 Mongo 2.2+ 中的一个函数。确保你拥有它。 有关它的更多信息,请查看official documentation

    【讨论】:

    • 古斯塔夫,感谢您的回复!如果达到我所说的 3000 个用户,全部存储 5 个分数,这不会影响性能吗?此外,在游戏的任何一轮中,多个并发用户都可以访问相同的功能——这是一个问答游戏——当用户错过三个问题时,他们会被从游戏中移除……这似乎会带来不必要的服务器负载过重。
    • 是的,它可能会;无论如何,你总是会在排行榜中保持前 X 名,对吗?如果是这样,最好将leaderboard 集合设为capped one :)
    • 再次感谢您的指导。这似乎更像是所需的解决方案,但原始响应确实工作得很好。
    猜你喜欢
    • 2013-12-11
    • 2016-02-15
    • 2012-10-27
    • 2011-11-25
    • 2017-10-27
    • 2012-11-20
    • 2016-05-29
    • 2015-06-27
    • 2016-03-18
    相关资源
    最近更新 更多