Mongodb 架构 - 如何设计才能快速了解可用的内容
Mongodb Architecture - How to design so I can quickly know what is available
我正在 MongoDB 中构建应用程序。这里的目标是读取速度非常快,但写入速度很慢。
假设我有三个集合:users
、polls
和 groups
。 users
创建属于一个 group
的 polls
,并且 users
可以加入多个 groups
。最后users
可以回答polls
。
一般一个用户会有 1-200 个左右 groups
,每个 group
可以有 10,000+ 个 polls
。不断增加新的投票。
目前我的数据结构是这样的:
user
存储 user
所属的每个 group_id
。
poll
存储它所属的 group_id
和回答它的 users
的列表。
我有一个以 user
身份登录的客户端 - 因此知道它的所有 groups
。有没有一种有效的方法可以让我找出 user
所在的每个 group
是否有未回答的 polls
?
一个解决方案是只通过每个 group
和 运行 查询:
db.polls.find({
group: group_id,
users: {$nin: [user_id]}
})
如果有人有 200 个组,这不是很有效。我的另一个想法是在应用程序的开头 运行 以上一次,然后缓存未回答的投票数。每当 user
回答民意调查时,此缓存值都会递减,直到应用程序再次 运行 查找操作时它的某个低数字。
我意识到这是一个有点开放性的问题,有时会让人皱眉,但不知道还能问到哪里!
如果快速识别用户未回答的投票非常重要,您可以通过存储代表每一对的文档来实现 (user, poll)
:
{
"user" : "Suzy Song",
"poll" : "What shape Lego block are you? Take this poll and you'll never believe what happens next! Top 10 celebrity Lego block shapes explained!"
"answered" : false
}
然后在 { "user" : 1, "answered" : 1 }
上建立索引并查询
db.poll_status.find({ "user" : "Suzy Song", "answered" : false })
db.poll_status.count({ "user" : "Suzy Song", "answered" : false })
一个用户在 200 个组中,每个组有 10,000 个民意调查,您可能有 2,000,000 个类似上面的文档。
或者您可以汇总每个用户或每个 (user, group)
在另一个集合中的数量
{
"user" : "Suzy Song",
"group" : "Polar Bear Club",
"unanswered_polls" : 999
}
并在每次在群组中创建新投票时以及当用户响应群组中的投票时进行适当更新。
我正在 MongoDB 中构建应用程序。这里的目标是读取速度非常快,但写入速度很慢。
假设我有三个集合:users
、polls
和 groups
。 users
创建属于一个 group
的 polls
,并且 users
可以加入多个 groups
。最后users
可以回答polls
。
一般一个用户会有 1-200 个左右 groups
,每个 group
可以有 10,000+ 个 polls
。不断增加新的投票。
目前我的数据结构是这样的:
user
存储user
所属的每个group_id
。poll
存储它所属的group_id
和回答它的users
的列表。
我有一个以 user
身份登录的客户端 - 因此知道它的所有 groups
。有没有一种有效的方法可以让我找出 user
所在的每个 group
是否有未回答的 polls
?
一个解决方案是只通过每个 group
和 运行 查询:
db.polls.find({
group: group_id,
users: {$nin: [user_id]}
})
如果有人有 200 个组,这不是很有效。我的另一个想法是在应用程序的开头 运行 以上一次,然后缓存未回答的投票数。每当 user
回答民意调查时,此缓存值都会递减,直到应用程序再次 运行 查找操作时它的某个低数字。
我意识到这是一个有点开放性的问题,有时会让人皱眉,但不知道还能问到哪里!
如果快速识别用户未回答的投票非常重要,您可以通过存储代表每一对的文档来实现 (user, poll)
:
{
"user" : "Suzy Song",
"poll" : "What shape Lego block are you? Take this poll and you'll never believe what happens next! Top 10 celebrity Lego block shapes explained!"
"answered" : false
}
然后在 { "user" : 1, "answered" : 1 }
上建立索引并查询
db.poll_status.find({ "user" : "Suzy Song", "answered" : false })
db.poll_status.count({ "user" : "Suzy Song", "answered" : false })
一个用户在 200 个组中,每个组有 10,000 个民意调查,您可能有 2,000,000 个类似上面的文档。
或者您可以汇总每个用户或每个 (user, group)
在另一个集合中的数量
{
"user" : "Suzy Song",
"group" : "Polar Bear Club",
"unanswered_polls" : 999
}
并在每次在群组中创建新投票时以及当用户响应群组中的投票时进行适当更新。