Я работаю над простым сервером, используя mon goose и express. Я использую mon goose populate () для заполнения поля comments
блога. Однако, когда я вызываю заполнение, я должен сделать следующее:
savedBlog.populate({ path: 'comments', model: 'Comment' }).execPopulate()
вместо простого
savedBlog.populate('comments').execPopulate()
Вызов не выполняется ( возвращает пустой массив вместо заполненного массива), если я не включу параметр модели. Почему я не могу просто назвать это вторым способом, если в моем определении схемы блога уже указан ref для поля comments
?
Mon goose модели (в 2 разных файлах, если это имеет значение):
- Блог
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())
})