查询Mongo数据库的数组

时间:2020-04-02 10:43:48

标签: mongodb

目前,我正在从事一个在在线训练营中一直在做的项目。这基本上是露营地的评论网站(我敢肯定会有很多人知道我的意思)。本质上,您可以注册自己,可以创建露营地,然后可以查看其他人。

我正在使用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");  
            }
        }
    }); 
}); 

总而言之,我要做的就是查询露营地数据库,以查找已删除其个人资料的用户进行了评论的露营地。

1 个答案:

答案 0 :(得分:0)

您应将用户ID设置为user._id而不是user.id

相关问题