在我的应用程序中,我有两个模型 - Book和Genre。我使用const mongoose = require('mongoose')
mongoose.Promise = global.Promise
const Schema = mongoose.Schema
const bookSchema = Schema({
name: {
type: String,
trim: true,
required: 'Please enter a book name'
},
description: {
type: String,
trim: true
},
author: {
type: String,
trim: true,
},
category: {
type: String,
trim: true
},
genre: [{
type: Schema.Types.ObjectId,
ref: 'Genre'
}]
})
module.exports = mongoose.model('Book', bookSchema)
从Book模型中引用了Genre模型。这就是我的模型的样子:
预订模型
const mongoose = require('mongoose')
mongoose.Promise = global.Promise
const Schema = mongoose.Schema
const genreSchema = Schema({
name: {
type: String,
trim: true,
required: 'Please enter a Genre name'
}
})
module.exports = mongoose.model('Genre', genreSchema)
类型模型
router.get('/edit/:id', (req, res, next) => {
const book = Book.findOne({ _id: req.params.id })
.populate({
path: 'genre',
model: 'Genre',
populate: {
path: 'genre',
model: 'Book'
}
})
.exec()
.then((book) => {
const genres = Genre.find({ 'genre': req.params.id })
res.render('editBook', { book, genres })
})
.catch((err) => {
throw err
})
})
router.post('/edit/:id', (req, res, next) => {
req.checkBody('name', 'Name is required').notEmpty()
req.checkBody('description', 'Description is required').notEmpty()
req.checkBody('category', 'Category is required').notEmpty
const errors = req.validationErrors()
if (errors) {
console.log(errors)
res.render('editBook', { book, errors })
}
const book = Book.findOneAndUpdate({ _id: req.params.id }, req.body,
{
new: true,
runValidators:true
}).exec()
.then((book) => {
res.redirect(`/books/edit/${book._id}`)
})
.catch((err) => {
res.send({
'message': err
})
})
})
在图书编辑页面上,我希望能够显示可用的类型,并检查已保存在该特定图书中的类型。
以下是我的路线:
.form-group
label.col-lg-2.control-label Genre
.col-lg-10
for genre in genres
.checkbox
input.checkbox(type='checkbox', name='genre', id=genre._id, value=genre._id, checked=genre.checked)
label(for=genre._id) #{genre.name}
应该显示类型的部分如下所示:
S01_2017925
S01_2017926
S01_20170926_105439
S01_20170926_122707
我可能做错了什么?我已经尝试了所有我知道的解决方案,但没有任何效果。
P.S :mongoose-deep-populate插件很长时间没有更新。我使用的解决方案适用于节目路线,可在此处找到 - https://stackoverflow.com/a/43464418/2119604
答案 0 :(得分:0)
您错误地使用了mongose populate
方法。 populate
返回父项和引用模型的对象。在你的情况下book
有一个类型数组(顺便说一句,它在你的模式中有错误的名称,单个而不是复数),所以你不需要额外的请求来加载类型:
router.get('/edit/:id', (req, res, next) => {
Book
.findOne({ _id: req.params.id })
.populate('genre')
.exec()
.then(book => res.render('editBook', { book, genres: book.genre }))
.catch(err => {
console.log(err);
next(err);
});
});