MongoDB中用户到项目数据库的建模
我有两张桌子 Movies,列出数据库中的所有电影。MongoDB中用户到项目数据库的建模,mongodb,database-design,mongoose,database,Mongodb,Database Design,Mongoose,Database,我有两张桌子 Movies,列出数据库中的所有电影。 用户,其中包含用户 通常,我会创建一个连接表来将用户连接到电影(如中所示,用户喜欢某部电影) 但是,既然在MongoDB中不能这样做,我该怎么办?我希望能够找到某个用户喜欢的所有电影,以及喜欢某个电影的所有用户,以及给定一组用户喜欢的电影 嵌入文档 谢谢 对于电影和这样的用户之间的多对多关系,我可能会为每部电影分别设置一个集合,但通过将其\u id和name字段嵌入likes数组,将喜欢电影的用户反规范化到电影集合中 通过这种方式,您可以检索
用户,其中包含用户 通常,我会创建一个连接表来将用户连接到电影(如中所示,用户喜欢某部电影) 但是,既然在MongoDB中不能这样做,我该怎么办?我希望能够找到某个用户喜欢的所有电影,以及喜欢某个电影的所有用户,以及给定一组用户喜欢的电影 嵌入文档
谢谢 对于电影和这样的用户之间的多对多关系,我可能会为每部电影分别设置一个集合,但通过将其
\u id
和name
字段嵌入likes
数组,将喜欢电影的用户反规范化到电影
集合中
通过这种方式,您可以检索喜欢电影的用户的姓名,而无需对用户
集合进行单独的查找,但仍有不会嵌入电影中的额外用户字段
权衡是,如果用户更改了这两个集合的名称,您需要更新它们,但我认为这是值得的成本
db.电影
{
_id: <objectid>,
name:"Star Wars",
likes: [
{ userid: <user-objectid>, name: "John Smith" },
{ userid: <user-objectid>, name: "Alice Brown" }
]
}
{
_id: <objectid>,
name: "John Smith",
username: "jsmith",
passwordhash: "d131dd02c5e6eec4693d"
}
{
_id:,
名称:“星球大战”,
喜欢:[
{userid:,名称:“John Smith”},
{userid:,名称:“Alice Brown”}
]
}
db.users
{
_id: <objectid>,
name:"Star Wars",
likes: [
{ userid: <user-objectid>, name: "John Smith" },
{ userid: <user-objectid>, name: "Alice Brown" }
]
}
{
_id: <objectid>,
name: "John Smith",
username: "jsmith",
passwordhash: "d131dd02c5e6eec4693d"
}
{
_id:,
姓名:“约翰·史密斯”,
用户名:“jsmith”,
密码哈希:“d131dd02c5e6eec4693d”
}
某些用户喜欢的电影
db.movies.find({“likes.userid”:},{“name”:1});
喜欢某部电影的用户
db.movies.find({u id:},
{“likes.userid”:1,“likes.name”:1});
特定用户喜欢的电影
db.movies.find({“likes.userid”):
{$in:[,]},
{“名称”:1});
对于电影和用户之间的这种多对多关系,我可能会为每部电影分别设置一个集合,但通过将其\u id
和name
字段嵌入likes
数组,将喜欢电影的用户反规范化到电影集合中
通过这种方式,您可以检索喜欢电影的用户的姓名,而无需对用户
集合进行单独的查找,但仍有不会嵌入电影中的额外用户字段
权衡是,如果用户更改了这两个集合的名称,您需要更新它们,但我认为这是值得的成本
db.电影
{
_id: <objectid>,
name:"Star Wars",
likes: [
{ userid: <user-objectid>, name: "John Smith" },
{ userid: <user-objectid>, name: "Alice Brown" }
]
}
{
_id: <objectid>,
name: "John Smith",
username: "jsmith",
passwordhash: "d131dd02c5e6eec4693d"
}
{
_id:,
名称:“星球大战”,
喜欢:[
{userid:,名称:“John Smith”},
{userid:,名称:“Alice Brown”}
]
}
db.users
{
_id: <objectid>,
name:"Star Wars",
likes: [
{ userid: <user-objectid>, name: "John Smith" },
{ userid: <user-objectid>, name: "Alice Brown" }
]
}
{
_id: <objectid>,
name: "John Smith",
username: "jsmith",
passwordhash: "d131dd02c5e6eec4693d"
}
{
_id:,
姓名:“约翰·史密斯”,
用户名:“jsmith”,
密码哈希:“d131dd02c5e6eec4693d”
}
某些用户喜欢的电影
db.movies.find({“likes.userid”:},{“name”:1});
喜欢某部电影的用户
db.movies.find({u id:},
{“likes.userid”:1,“likes.name”:1});
特定用户喜欢的电影
db.movies.find({“likes.userid”):
{$in:[,]},
{“名称”:1});
在MongoDB中可以这样做,但不能在数据库级别执行“加入”操作,必须在应用程序级别执行
如果你有数以百万计的电影和数以百万计的用户,你必须使用一个加入集合来完成这项工作,因为你无法将一部电影或一个用户的喜欢数量放入任何一个文档中
查找用户并获取其_id
使用匹配的_id值查找UserMovie文档
根据需要查找电影
您可能在这里进行的非规范化是将电影名称存储在UserMovie集合中,这样您就可以显示用户喜欢的电影,而无需从电影集合中获取每一部电影
可能的优化
您可以在此方案上尝试的一个优化是在UserMovie集合中创建包含多个关系的文档,而不是为每个关系使用单个文档(就像在SQL中一样)
例如,如果最常见的访问模式是查找用户喜欢的电影,则可以按用户对它们进行分组,并将它们放入一个或多个按该用户id索引的文档中。请查看中的语句组以获得更完整的解释。在MongoDB中可以这样做,但不能在数据库级别执行“加入”操作,您必须在应用程序级别执行此操作
如果你有数以百万计的电影和数以百万计的用户,你必须使用一个加入集合来完成这项工作,因为你无法将一部电影或一个用户的喜欢数量放入任何一个文档中
查找用户并获取其_id
使用匹配的_id值查找UserMovie文档
根据需要查找电影
您可能在这里进行的非规范化是将电影名称存储在UserMovie集合中,这样您就可以显示用户喜欢的电影,而无需从电影集合中获取每一部电影
可能的优化
您可以在此方案上尝试的一个优化是在UserMovie集合中创建包含多个关系的文档,而不是为每个关系使用单个文档(就像在SQL中一样)
例如,如果最常见的访问模式是查找用户喜欢的电影,则可以按用户对其进行分组,并将其放入一个或多个按该用户id编制索引的文档中。有关更完整的解释,请查看中的StatementGroups