[英]How to model many-to-many relationships in MongoDB (for a MySQL user)
我来自MySQL
背景,我试图围绕MongoDB
。 特别是,我正在努力构思我应该如何建模n:n
关系“Mongo方式”。
对于这个例子,假设我们有两个collections
: users
和interests
。 我们需要能够在数据中表示或查询几件事:
在MySQL
,我会创建一个在用户ID 和兴趣ID上编入索引的users_interests
表。 对于计数器,我会为每种评级类型设置单独的列,并且每次用户对兴趣进行评级/未评级时,都要完成一项事务以确保计数永远不会错误。
我试过阅读一些架构设计 ,但无济于事。
你能帮助失落的灵魂找到方向吗?
好问题。 让我先概述一下N:N关系的工作原理,然后我将详细介绍每个要点。
在MySQL中N:N通常您的数据透视表与您的用户和兴趣(user_interests表)之间存在关联。 在mongo你这样做有点不同。 您仍然拥有用户和兴趣集合,但现在,您可以存储用户感兴趣的密钥列表。 这样的事情:
User Collection {
"name":"Josh",
"user":"jsmith",
"interests":[
{
"_id":12345,
"rating":"like"
},
{..}..
]
}
通过将您的兴趣存储在您感兴趣的表格中的关键列表中,您可以执行所需的每项操作。 如果您想进行查询,可以根据兴趣表中的ID进行查询,然后使用$ in修饰符进行查询。
现在为了您的兴趣收集我会做以下事情:
User Interest {
"_id":objectId
"label":"Swimming",
"count":intValue
}
当向用户文档添加兴趣时,count变量将取决于您的评级的定义。 如果您将评级存储在单独的区域(或逻辑)中,那么您分配给它们的值将与您感兴趣的int值相关。 IE:用户对它进行评级(值为1)然后将计数值加1。
希望这是有用的,至少带来了一些关于如何构建它的其他想法!
祝你好运,记住MONGO真棒。
为了维护每个兴趣的评级的全局计数,您将需要一个单独的独立集合,您可以使用原子更新运算符更新(添加或减少)评级,以及当用户执行感兴趣/不喜欢的操作时。
您可以将每个用户的兴趣存储为User集合本身的子文档数组。
此数据的JSON结构类似于:
db.User
{
name: 'joe',
....,
interests : [{ name: 'swimming', rating: 10},
{ name: 'cooking', rating: 22 }
]
}
现在您可以使用以下命令查询内部键:
> db.User.find( { "interests.name" : "cooking" } )
这将返回特别感兴趣的用户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.