目前,我正在进行一个在线训练营中进行的项目。这基本上是一个露营地的评论网站(我相信会有很多人知道我的意思(。从本质上讲,你可以自己注册,你可以创建营地,然后你可以审查其他人。
我使用的是mongo数据库(如本课程所述(。
目前,我正在研究一条用户可以删除其个人资料的途径。用户还可以成功删除其他露营地的贡献和评论。然而,露营地的平均评级是根据露营地模型确定的。每当有人评论露营地时,他们的评论(评级、评论、姓名、用户id、日期等(
以下是露营地模型的视图:
const campgroundSchema = new mongoose.Schema({
name: {
type: String,
required: "This field cannot be left blank"
},
image: String,
imageId: String,
description: String,
price: String,
createdAt: { type: Date, default: Date.now},
author: {
id: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
},
username: String
},
comments: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Comment"
}
],
slug: {
type: String,
unique: true,
trim: true
},
reviews: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Review"
}
],
rating: {
type: Number,
default: 0
}
});
以下是评论的模型:
var reviewSchema = new mongoose.Schema({
rating:{
//set the field type
type: Number,
//Making the star rating required
required: "Please provide a rating (1 to 5 stars)",
//Define minimum and maximum values:
min: 1,
max: 5,
//Add validation to ensure that entry is an integer:
validate:{
validator: Number.isInteger,
message: "{VALUE} is not an integer value"
}
},
text:{
type: String,
},
author: {
id:{
type: mongoose.Schema.Types.ObjectID,
ref: "User"
},
username: String
},
campground: {
type: mongoose.Schema.Types.ObjectID,
ref: "Campground",
}
}, {
//timestamps: mongoose assings createdAt and updatedAt to the schema.
timestamps:true
});
现在,每当我删除用户配置文件时,阵列中的评论都会被删除(很棒(,但我需要连接到营地来运行一个功能,为他们提供适当的评级。
以下是删除用户的路径:
router.delete("/users/:id", middleware.isLoggedIn, (req, res)=>{
User.findById(req.params.id, (err, user)=>{
if(err){
console.log(err);
req.flash("err", "UNABLE TO DELETE PROFILE " + err.message)
}
// delete campgrounds - finds campgrounds based on author.id and deletes them
Campground.deleteMany({"author.id": user.id}, (err)=>{
if(err){
console.log(err);
}
});
//delete reviews - finds reviews based on author.id and deletes them
Review.deleteMany({"author.id": user.id}, (err)=>{
if(err){
console.log(err)
}
// WHERE I'M STUCK
Campground.findOne( { reveiws: {"author.id":user.id} }, {new: true}). exec((err, campground)=>{
if(err){
console.log("ERROR: " + err.message);
} else{
console.log("CAMPGROUND: " + campground);
}
});
});
//delete profile picture from cloudinary
try{
cloudinary.v2.uploader.destroy(user.imageId);
user.remove();
res.redirect("/campgrounds");
} catch(err){
if(err){
req.flash("error", err.message);
return res.redirect("back");
}
}
});
});
总之,我所需要做的就是查询露营地数据库,找到那些被删除个人资料的用户审查过的露营地。
您应该将用户id作为用户_id而不是user.id