Mon goose populate () не работает, если я явно не укажу параметр "модель" - PullRequest
0 голосов
/ 05 мая 2020

Я работаю над простым сервером, используя mon goose и express. Я использую mon goose populate () для заполнения поля comments блога. Однако, когда я вызываю заполнение, я должен сделать следующее:

savedBlog.populate({ path: 'comments', model: 'Comment' }).execPopulate()

вместо простого

savedBlog.populate('comments').execPopulate()

Вызов не выполняется ( возвращает пустой массив вместо заполненного массива), если я не включу параметр модели. Почему я не могу просто назвать это вторым способом, если в моем определении схемы блога уже указан ref для поля comments?

Mon goose модели (в 2 разных файлах, если это имеет значение):

  1. Блог
    const mongoose = require('mongoose')

    const blogSchema = mongoose.Schema({
      title: { type: String, required: true },
      author: String,
      url: { type: String, required: true },
      likes: { type: Number, default: 0 },
      comments: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Comment'
      }],
      user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
      }
    })

    blogSchema.set('toJSON', {
      transform: (doc, ret) => {
        ret.id = ret._id.toString()
        delete ret._id
        delete ret.__v
      }
    })

    module.exports = mongoose.model('Blog', blogSchema)

Комментарий

const commentSchema = mongoose.Schema({
  content: { type: String, required: true },
  blog: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Blog'
  }
})

commentSchema.set('toJSON', {
  transform: (doc, ret) => {
    ret.id = ret._id.toString()
    delete ret._id
    delete ret.__v
  }
})

module.exports = mongoose.model('Comment', commentSchema)

Мой файл маршрутизатора: работает правильно. Но у меня вопрос: почему я не могу просто позвонить savedBlog.populate('comments'), если я уже указал

comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }]

в определении схемы моего блога?

...
const Comment = require('../models/comment')
const Blog = require('../models/blog')
...


blogRouter.post('/:id/comments', async(req, res) => {
  const comment = new Comment(req.body)

  const blog = await Blog.findById(req.params.id)
  comment.blog = blog._id
  const savedComment = await comment.save()

  blog.comments.push(savedComment._id)
  const savedBlog = await blog.save()
  await savedBlog.populate({ path: 'comments', model: 'Comment' }).execPopulate()

  res.status(201).json(savedBlog.toJSON())
})
...