Для отношений «многие ко многим» между фильмами и пользователями, подобными этим, у меня, вероятно, будут отдельные коллекции для каждого, но денормализовать пользователей, которым нравится фильм, в коллекцию movies
, добавив их _id
и * 1003.* поля в массиве 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 } );