【问题标题】:MongoDB: Frequent subdocument update or DB redesign?MongoDB:频繁的子文档更新或数据库重新设计?
【发布时间】:2012-04-11 09:29:04
【问题描述】:

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

我的视频插槽社交应用程序包含 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 的方式思考。提前致谢

【问题讨论】:

    标签: performance mongodb indexing


    【解决方案1】:

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

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

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

    这应该可以让您立即查找您的文档,并且再次很容易设置整个插槽数组值。

    【讨论】:

    • 我做错了什么?我已经按照您的建议创建了一个唯一的复合索引,但它仍然允许我在现有 slotId 的数组中插入新文档?
    • 我找到了答案:唯一索引适用于整个文档,不能用于强制文档中的单个数组条目不重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    相关资源
    最近更新 更多