Performance MongoDB:频繁更新子文档还是重新设计数据库?
我正在寻找在以下情况下如何提高数据库性能的技巧。 (或者我应该考虑DB的重新设计) 我有50多个不同的视频槽的视频槽社交应用程序。问题是,在每次用户旋转时,我都必须将插槽信息保存到DB 目前,我有以下DB结构:1个包含用户配置文件的集合和slots数组中的许多slots子文档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: [
{
_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在数组中插入新文档?我找到了答案:唯一索引作为一个整体应用于文档,不能用于强制文档中的单个数组项不重复。