Чтобы упростить манипулирование базой данных MongoDB, мы можем использовать пакет Mongoose NPM, чтобы упростить работу с базами данных MongoDB.
В этой статье мы рассмотрим, как использовать Mongoose для управления нашей базой данных MongoDB.
Динамические ссылки через `refPath`
Мы можем объединить более одной модели с динамическими ссылками и свойством refPath
.
Например, мы можем написать:
async function run() { const { createConnection, Types, Schema } = require('mongoose'); const db = createConnection('mongodb://localhost:27017/test'); const commentSchema = new Schema({ body: { type: String, required: true }, subject: { type: Schema.Types.ObjectId, required: true, refPath: 'subjectModel' }, subjectModel: { type: String, required: true, enum: ['BlogPost', 'Product'] } }); const Product = db.model('Product', new Schema({ name: String })); const BlogPost = db.model('BlogPost', new Schema({ title: String })); const Comment = db.model('Comment', commentSchema); const book = await Product.create({ name: 'Mongoose for Dummies' }); const post = await BlogPost.create({ title: 'MongoDB for Dummies' }); const commentOnBook = await Comment.create({ body: 'Great read', subject: book._id, subjectModel: 'Product' }); await commentOnBook.save(); const commentOnPost = await Comment.create({ body: 'Very informative', subject: post._id, subjectModel: 'BlogPost' }); await commentOnPost.save(); const comments = await Comment.find().populate('subject').sort({ body: 1 }); console.log(comments) } run();
У нас есть commentSchema
со свойствами subject
и subjectModel
.
subject
устанавливается как идентификатор объекта. У нас есть свойство refPath
, которое ссылается на модель, на которую оно может ссылаться.
refPath
установлен на subjectModel
, а subjectModel
ссылается на модели BlogPost
и Product
.
Таким образом, мы можем связать комментарии с записью Product
или Post
.
Чтобы выполнить привязку к нужной нам модели, мы устанавливаем subject
и subjectModel
при создании записи с помощью метода create
.
Затем мы вызываем populate
с subject
, чтобы получить данные поля subject
.
Точно так же мы можем поместить связанные элементы в корневую схему.
Например, мы можем написать:
async function run() { const { createConnection, Types, Schema } = require('mongoose'); const db = createConnection('mongodb://localhost:27017/test'); const commentSchema = new Schema({ body: { type: String, required: true }, product: { type: Schema.Types.ObjectId, required: true, ref: 'Product' }, blogPost: { type: Schema.Types.ObjectId, required: true, ref: 'BlogPost' } }); const Product = db.model('Product', new Schema({ name: String })); const BlogPost = db.model('BlogPost', new Schema({ title: String })); const Comment = db.model('Comment', commentSchema); const book = await Product.create({ name: 'Mongoose for Dummies' }); const post = await BlogPost.create({ title: 'MongoDB for Dummies' }); const commentOnBook = await Comment.create({ body: 'Great read', product: book._id, blogPost: post._id, }); await commentOnBook.save(); const comments = await Comment.find() .populate('product') .populate('blogPost') .sort({ body: 1 }); console.log(comments) } run();
Затем мы устанавливаем product
и blogPost
в один и тот же объект.
Мы переставили commentSchema
, чтобы в нем были ссылки на products
и blogPost
.
Затем мы вызываем populate
в обоих полях, чтобы получить комментарии.
Заключение
Мы можем ссылаться на несколько схем внутри схемы.
Затем мы можем вызвать populate
, чтобы получить все поля.