1

我正在寻找有关如何在以下情况下提高数据库性能的提示。(或者也许我应该考虑重新设计数据库)。

我有 50 多个不同视频插槽的视频插槽社交应用程序。问题是每次用户旋转时,我都必须将插槽信息保存到 DB。

目前我有以下数据库结构: 1 个包含用户配置文件的集合和插槽数组中的许多插槽子文档。

{
  _id: 1,
  firstName: John,
  lastName: Smoth,
  money: 1000,
  aLotOfOtherUserInfo: true,

  slots:
  [
    {
      slotId: 1,
      bet: 1,
      lines: 25,
      payout: 100,
      reels: [...]
      winnings: [...]
      freeSpins: [...]
    }
  ]
}

在任何插槽中的每个用户旋转时,我都必须完全更新插槽数组中的插槽信息。插槽由slotId找到。

update(
  { 
    "_id": 1, 
    "slots.slotId": 1
  },
  { 
    $set: {"slots.$": 
    {
      "slotId":1,
      aLotOfUpdatedSlotInfo: true
    }}
  }
)
  • 我是否需要在“slots.slotId”上创建索引以改进所需的插槽搜索?
  • 或者也许我应该考虑重新设计数据库并将每个用户插槽存储在单独的集合中?但是,例如,在用户登录时,我将不得不循环浏览所有集合并加载当前用户的所有插槽信息。所以这不是我认为在每个用户登录时进行 50 多个查询的好选择。

非常感谢您的帮助。我是 NoSQL 的新手,有时很难以 NoSQL 的方式思考。提前致谢

4

1 回答 1

1

如果您的插槽数据在每次“用户旋转”时总是无效并且您每次都必须完全设置它,那么它可能在用户文档中工作得很好。为您节省了必须从用户文档中查找“插槽”ID 引用,然后更新“插槽”文档的查询。

是的,您绝对应该不仅在 . 上有一个索引slots.slotId,而且在那个和 _id 上都有一个复合索引来匹配您的实际查询:

db.user_profile.ensureIndex({_id:1, "slots.slotId":1})

这应该使查找您的文档变得非常容易,并且再次很容易设置整个插槽数组值。

于 2012-04-11T10:17:17.573 回答