MongoDB:频繁的子文档更新或DB重新设计?

时间:2012-04-11 09:29:05

标签: performance mongodb indexing

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

我有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方式思考。提前致谢

1 个答案:

答案 0 :(得分:1)

如果您的插槽数据在每次“用户旋转”时始终无效,并且您每次都必须完全设置它,那么它可能在用户文档中正常工作。保存查询,必须从用户文档中查找“slots”id引用,然后更新“slots”文档。

是的,你不仅应该在slots.slotId上有一个索引,而且还要有一个复合索引和_id以匹配你的实际查询:

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

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