Чтобы упростить манипулирование базой данных 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, чтобы получить все поля.