构造简单MongoDB集合的正确方法

时间:2019-05-05 18:00:25

标签: javascript mongodb mongoose

所以说我有一个这样的模式

const ServerSchema = new mongoose.Schema<ServerModel>({
  serverId: { type: String },
  users: {
    type: Map,
    of: UserSchema
  }
});

const UserSchema = new mongoose.Schema<UserModel>({
  userId: { type: String },
  score: { type: Number }
});

我有多台服务器,每台服务器都包含一张用户地图。到目前为止,这种模式是有意义的,对我而言似乎还很干净,我需要了解的关于Server的所有内容都在Server集合下。但是现在我试图创建一个查询来查找给定服务器中得分最高的10位用户。在这里,我会遇到一些有关执行此操作的正确方法的问题,这使我对当前的架构提出了疑问。据我所知,我需要针对当前架构执行以下操作

function getTop10Score(serverId) {
  let server = ServerModel.findOne({ serverId }, { users: 1 })
  let users = server.get('users');
  let sortedUsers = users.sort(// sort by score)
  return first 10 from sortedUsers
}

这似乎可行,但我看到了2个问题

  1. 如果服务器上有很多用户,一次查询所有用户可能不是很有效。
  2. 感觉我应该能够纠正一个查询,该查询恰好返回我想要的东西,即来自服务器的前10位用户(按得分排序)。现在,Mongo只是在查询单个服务器,而我正在手动解决其余的查询。这似乎是对Mongo的不当使用。

所以我在想

A。使用当前的模式可以创建这种单一查询,我只是对查询不了解如何做到这一点,或者

B。我应该创建另一个集合来表示服务器中用户的分数。像

const UserScoreSchema = ...({
  serverId: { type: String },
  userId: { type: String },
  score: { type: Number }
})

然后创建一个查询来执行我想要的事情似乎很简单。

任何人都认为哪种方法最惯用?

0 个答案:

没有答案