Работа с сопутствующими документами-популяциями и моделями - PullRequest
0 голосов
/ 14 июня 2019

Я довольно новичок в этих технологиях, и я не знаю, правильно ли я это понимаю.
Я пытаюсь напечатать в таблице название категории вместо идентификатора (поле схемы ObjectId) всех документов Category, связанных с документами Post.Но он продолжает показывать идентификатор.Помогите пожалуйста!

route / posts.js

Post
        .find({})
        .populate('Category')
        .exec((err, posts) => {
            if (err) return res.json({ error: err })
            posts.category = posts.category.name
            res.render('posts/index', {
                postList: posts
            })
        })

моделей

let categorySchema = new Schema({
    name: String,
    posts: [{ type: Schema.Types.ObjectId, ref: 'Post' }]
})
module.exports = mongoose.model('Category', categorySchema)

let postSchema = new Schema({
    title: String,
    content: String,
    date: String,
    category: {type: Schema.Types.ObjectId, ref: 'Category' }
})
module.exports = mongoose.model('Post', postSchema)

просмотров /posts / index.pug

tbody
            each post in postList
                tr
                    td #{post.title}
                    td #{post.content}
                    td #{post.date}
                    td #{post.category}  <--HERE IS WHERE I NEED
                                            post.category.name

1 Ответ

0 голосов
/ 14 июня 2019

Вы пытаетесь заполнить категорию поля, так как она имеет отношение в схеме с категорией коллекции, вам нужно просто заполнить категорию поля, а не коллекцию.

Добавьте это к своим моделям:

let categorySchema = new Schema({
    name: String,
    posts: [{ type: Schema.Types.ObjectId, ref: 'Post' }]
})
categorySchema.set('toJSON', {virtuals: true})
module.exports = mongoose.model('Category', categorySchema)

let postSchema = new Schema({
    title: String,
    content: String,
    date: String,
    category: {type: Schema.Types.ObjectId, ref: 'Category' }
})
postSchema.set('toJSON', {virtuals: true})
module.exports = mongoose.model('Post', postSchema)

Затем попробуйте это:

Post.find({})
  .populate({path: 'category'}, {select: 'name'})
  .exec((err, posts) => {
     if (err) return res.json({ error: err })
       posts.category = posts.category.name
       res.render('posts/index', {
          postList: posts
   })
})

Предложение select должно получить только имя поля из этой коллекции

Для получения дополнительной информации вы можете проверить эту ссылку: https://mongoosejs.com/docs/populate.html

Надеюсь, я вам помог

...