Метод 1: встроенные документы
MongoDB позволяет встраивать связанные документы в родительский документ. Этот метод денормализации полезен, когда связанные данные невелики и не меняются часто. Давайте рассмотрим пример, где у нас есть коллекция «пользователи» и коллекция «комментарии». Каждый пользователь может иметь несколько комментариев. Чтобы включить комментарии при запросе пользователей, вы можете использовать оператор $lookupв сочетании с $match:
db.users.aggregate([
{
$lookup: {
from: "comments",
localField: "_id",
foreignField: "userId",
as: "comments",
},
},
]);
Метод 2: Ссылки на руководство
Другой подход заключается в использовании ссылок на руководство, когда вы сохраняете ссылки на связанные документы в родительском документе. Например, предположим, что у нас есть коллекция «пользователи» и коллекция «продукты», и у каждого пользователя может быть несколько любимых продуктов. Вот как можно добавить избранные продукты, используя ссылки вручную:
db.users.find({}).forEach(function(user) {
user.favoriteProducts = db.products.find({ userId: user._id }).toArray();
db.users.save(user);
});
Метод 3: ссылки на ObjectId
В MongoDB каждый документ имеет уникальный ObjectId. Вы можете использовать это свойство для установления связей между коллекциями. Продолжая наш пример «пользователи» и «комментарии», давайте посмотрим, как включать комментарии с помощью ссылок ObjectId:
const userId = ObjectId("user_id_here");
db.comments.find({ userId: userId });
Метод 4: ссылки на базы данных
MongoDB также предоставляет функцию под названием «Ссылки на базы данных», с помощью которой вы можете поддерживать связи между коллекциями с помощью полей $refи $id. Этот метод требует создания справочного документа. Вот пример:
db.users.insert({ name: "John Doe", comments: [DBRef("comments", ObjectId("comment_id_here"))] });
db.comments.findOne({ _id: ObjectId("comment_id_here") });
В этой статье мы рассмотрели несколько методов включения связей в запросы MongoDB. Мы рассмотрели встроенные документы, ссылки на руководства, ссылки ObjectId и ссылки на базы данных. Каждый метод имеет свои преимущества и подходит для разных сценариев. Поняв эти методы, вы сможете эффективно управлять отношениями между коллекциями в MongoDB и оптимизировать запросы к базе данных.
Не забудьте выбрать наиболее подходящий метод в зависимости от вашего конкретного случая использования с учетом таких факторов, как размер данных, производительность запросов и согласованность данных. Удачных запросов!