MongoDB中用户到项目数据库的建模

MongoDB中用户到项目数据库的建模,mongodb,database-design,mongoose,database,Mongodb,Database Design,Mongoose,Database,我有两张桌子 Movies,列出数据库中的所有电影。 用户,其中包含用户 通常,我会创建一个连接表来将用户连接到电影(如中所示,用户喜欢某部电影) 但是,既然在MongoDB中不能这样做,我该怎么办?我希望能够找到某个用户喜欢的所有电影,以及喜欢某个电影的所有用户,以及给定一组用户喜欢的电影 嵌入文档 谢谢 对于电影和这样的用户之间的多对多关系,我可能会为每部电影分别设置一个集合,但通过将其\u id和name字段嵌入likes数组,将喜欢电影的用户反规范化到电影集合中 通过这种方式,您可以检索

我有两张桌子

Movies,列出数据库中的所有电影。
用户,其中包含用户

通常,我会创建一个连接表来将用户连接到电影(如中所示,用户喜欢某部电影)

但是,既然在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