I am facing a problem in my virtual populate even though I have activated toJSON and toObject { virtuals : true} property i my Schema....
I have a tour Model like this in which I want ALL reviews
const tourSchema = new mongoose.Schema(
{
name: {
type: String,
required: [true, 'A tour must have a name'],
unique: true,
trim: true,
maxlength: [40, 'A tour name must have less or equal then 40 characters'],
minlength: [10, 'A tour name must have more or equal then 10 characters']
// validate: [validator.isAlpha, 'Tour name must only contain characters']
},
slug: String,
duration: {
type: Number,
required: [true, 'A tour must have a duration']
},
maxGroupSize: {
type: Number,
required: [true, 'A tour must have a group size']
},
difficulty: {
type: String,
required: [true, 'A tour must have a difficulty'],
enum: {
values: ['easy', 'medium', 'difficult'],
message: 'Difficulty is either: easy, medium, difficult'
}
},
ratingsAverage: {
type: Number,
default: 4.5,
min: [1, 'Rating must be above 1.0'],
max: [5, 'Rating must be below 5.0'],
set: val => Math.round(val * 10) / 10 // 4.666666, 46.6666, 47, 4.7
},
ratingsQuantity: {
type: Number,
default: 0
},
price: {
type: Number,
required: [true, 'A tour must have a price']
},
guides: [
{
type: mongoose.Schema.ObjectId,
ref: 'User'
}
]
}
// ,
// {
// toJSON: { virtuals: true },
// toObject: { virtuals: true }
// }
);
tourSchema.set('toObject', { virtuals: true });
tourSchema.set('toJSON', { virtuals: true });
// Virtual Populate
tourSchema.virtual('reviews', {
ref: 'Review',
foreignField: 'tour',
localField: '_id'
});
const Tour = mongoose.model('Tour', tourSchema);
module.exports = Tour;
and this is reviewsModel
const reviewsSchema = new mongoose.Schema(
{
review: {
type: String,
required: [true, 'Review cannot be empty !']
},
rating: {
type: Number,
min: 1,
max: 5
},
createdAt: {
type: Date,
default: Date.now
},
tour: {
type: mongoose.Schema.ObjectId,
ref: 'Tour',
required: [true, 'A Review must belong to a tour !']
},
user: {
type: mongoose.Schema.ObjectId,
ref: 'User',
required: [true, 'A Review must belong to a User !']
}
},
{
toJSON: { virtuals: true },
toObject: { virtuals: true }
}
);
const Review = mongoose.model('Review', reviewsSchema);
plz help me I have watched all question regarding to this issue on stackOverflow but they all said add toJSON and toObject and everything would be fine....But My project is still NOT fine...
In tourController.js
, getTour
function, populate the reviews
:
const tour = await Tour.findById(req.params.id).populate("reviews");