Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance MongoDB:频繁更新子文档还是重新设计数据库?_Performance_Mongodb_Indexing - Fatal编程技术网

Performance MongoDB:频繁更新子文档还是重新设计数据库?

Performance MongoDB:频繁更新子文档还是重新设计数据库?,performance,mongodb,indexing,Performance,Mongodb,Indexing,我正在寻找在以下情况下如何提高数据库性能的技巧。 (或者我应该考虑DB的重新设计) 我有50多个不同的视频槽的视频槽社交应用程序。问题是,在每次用户旋转时,我都必须将插槽信息保存到DB 目前,我有以下DB结构:1个包含用户配置文件的集合和slots数组中的许多slots子文档 { _id: 1, firstName: John, lastName: Smoth, money: 1000, aLotOfOtherUserInfo: true, slots: [

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

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

目前,我有以下DB结构:1个包含用户配置文件的集合和slots数组中的许多slots子文档

{
  _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”上创建索引以改进所需的插槽搜索
  • 或者我应该考虑重新设计DB并将每个用户槽存储在单独的集合中?但是,例如,在用户登录时,我必须循环浏览所有集合并加载当前用户的所有插槽信息。因此,我认为,对每个用户登录进行50多次查询不是一个好的选择

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

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

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

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

这将使查找文档变得非常方便,而且只需设置整个插槽数组值也非常容易。

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

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

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

这将使查找您的文档变得非常方便,而且只需设置整个插槽数组值也非常容易。

我做错了什么?我已经按照您的建议创建了一个唯一的复合索引,但它仍然允许我使用现有slotId在数组中插入新文档?我找到了答案:唯一索引应用于整个文档,不能用于强制文档中的单个数组项不重复。我做错了什么?我已经按照您的建议创建了一个唯一的复合索引,但它仍然允许我使用现有slotId在数组中插入新文档?我找到了答案:唯一索引作为一个整体应用于文档,不能用于强制文档中的单个数组项不重复。