对于像这样的电影和用户之间的多对多关系,我可能会为每个用户设置单独的集合,但是通过嵌入他们的 _id 和 @987654323 将喜欢电影的用户非规范化到 movies 集合中@ 字段到 likes 数组中。
这样,您可以检索喜欢电影的用户的姓名,而无需单独查找 users 集合,但仍有额外的用户字段不会嵌入到电影中。
权衡的是,如果用户更改了他们的名字,您需要同时更新这两个集合,但我认为这是值得的。
db.movies
{
_id: <objectid>,
name:"Star Wars",
likes: [
{ userid: <user-objectid>, name: "John Smith" },
{ userid: <user-objectid>, name: "Alice Brown" }
]
}
db.users
{
_id: <objectid>,
name: "John Smith",
username: "jsmith",
passwordhash: "d131dd02c5e6eec4693d"
}
某个用户喜欢的电影
db.movies.find( { "likes.userid": <user-objectid> }, { "name": 1 } );
喜欢某部电影的用户
db.movies.find( { "_id": <movie-objectid> },
{ "likes.userid": 1, "likes.name": 1 } );
特定用户喜欢的电影
db.movies.find( { "likes.userid":
{ $in: [ <user1-objectid>, <user2-objectid> ] } },
{ "name": 1 } );