MongoDB中的多个模式(使用Mongoose)

时间:2013-04-15 18:01:18

标签: node.js mongodb mongoose

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

我有一种情况,我希望有两套游戏记录: 1.用户 2.领导委员会

用户信息包括用户名,密码,游戏次数和用户的前5个分数。我目前有一个为此设置的架构,它完美无缺。

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

任何建议都将受到赞赏。

我确信这是其他人过去遇到过的问题,如果已经在这里讨论过,我道歉,但我已经搜索过并且找不到类似的内容。

1 个答案:

答案 0 :(得分:2)

您不需要其他集合来执行此操作。您可以使用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