Я пытаюсь использовать встроенный в Mon goose метод Model.populate()
для объекта Post
, чтобы 1) получить отзывы внутри этого объекта, затем 2) вложенную опцию populate:{}
внутри, чтобы получить username
свойство author
review
от ObjectId
из User
.
Я, вероятно, упускаю что-то действительно очевидное и простое, но 5i sh часов позже я не могу найти это. Я вижу, что исходный populate()
получает ObjectId
author
от объекта Review
в массиве внутри Post
, но затем он не использует этот ObjectId
для поиска username
свойство этого User
объекта, вместо этого он возвращает Undefined
, поэтому троичный оператор в моем файле e js показывает имя пользователя: откат "Anonymous".
Любая помощь для того, что я отсутствует будет оценена.
Модель сообщения:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const postSchema = new Schema({
title:String,
price:Number,
description:String,
images: [
{
url: {
type:String,
default:'https://res.cloudinary.com/rgreenstreet/image/upload/v1578603203/surf_shop/post/149933_txhwtj.png'
},
public_id: String,
}
],
location: {
formattedAddress:String,
lat:Number,
lng:Number
},
author:
{
type:Schema.Types.ObjectId,
ref:'User'
},
reviews:[],
averageRating:{
type:Number,
default:0
}
});
module.exports = mongoose.model('Post',postSchema);
Модель обзора:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const reviewSchema = new Schema({
body:String,
rating:Number,
author:
{
type:Schema.Types.ObjectId,
ref:'User'
}
});
module.exports = mongoose.model('Review',reviewSchema);
Модель пользователя:
const mongoose = require('mongoose');
const passportLocalMongoose = require('passport-local-mongoose');
const Schema = mongoose.Schema;
const userSchema = new Schema({
username:String,
email:String,
image: {
url: {
type:String,
default:'https://cdn.pixabay.com/photo/2015/10/05/22/37/blank-profile-picture-973460_960_720.png'
},
public_id: String
},
isAdmin:{
type:Boolean,
default:false
}
});
userSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model('User',userSchema);
"Показать" маршрут для Post:
post = await Post.findById(req.params.id).populate({
path:'review',
options:{sort: {'_id':-1}},
populate:{
path:'author',
model:'User'
}
});
res.render('posts/show',{post, title: 'SurfShop - View '+post.title, page:'view_post' });
И в моем файле e js я пытаюсь заполнить в review.author.username
:
<div class="review">
<% post.reviews.forEach((review) => { %>
<p><%= review.body %> - <%= review.rating %> Stars<%= (review.author.username ? ' - '+review.author.username : ' - Anonymous') %></p>
<hr/>
<% }); %>
</div>