模式引用存储整个值而不是单独的ObjectId

时间:2018-01-26 10:29:25

标签: node.js mongodb mongoose mongodb-query mongoose-schema

最近,我一直在学习名为 The Web Developer Course 的课程。 最终项目以Camps为基础。 在项目中,引用了评论数据库和 campground 数据库,即评论 ObjectIds 发布在露营地中的内容存储在阵列中。这是实际发生的事情。

但在我的情况下,确切的情况发生了变化。当我尝试添加新评论时,实际发生的是总对象存储在 comments array ,而不是评论的 ObjectId 。 我几乎已经通过Stackoverflow为我的问题寻求解决方案,但失败了。

我只是想将 ObjectId 存储在评论数组中,而是存储整个对象,这会给我带来更新和删除的问题一条评论。当我删除或更新注释时,操作确实发生在注释数据库中,但没有反映在Campgrounds数据库中。请帮我解决这个问题。如果有人采取相同的课程,如果你已经经历过这样的事情,请给我解决方案。架构如下所示

露营地架构:

var mongoose = require("mongoose");

var campgroundSchema = mongoose.Schema({
    campGroundName: String,
    campGroundImage: String,
    description: String,
    comments: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: "Comment"
        }    
    ],
    addedBy: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User"
        },
        username: String
    }
});

module.exports = mongoose.model("Campground", campgroundSchema);

评论架构:

var mongoose = require("mongoose");

var commentSchema = mongoose.Schema({
    text: String,
    author: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User"
        },
        username: String
    }
});

module.exports = mongoose.model("Comment", commentSchema);

发布评论的请求:

router.post("/", middleware.isLoggedIn, function(req, res) {
    Comment.create(req.body.comment, function(err, createdComment) {
          if(err) {
              console.log(err);
          } else {
              createdComment.author.id = req.user._id;
              createdComment.author.username = req.user.username;
              createdComment.save();                  Campground.findById(req.params.id).populate("comments").exec(function(err, foundCampground){
              foundCampground.comments.push(createdComment);
              foundCampground.save();
              req.flash("success" , "Comment created successfully");
              res.redirect("/index/" + req.params.id); 
             });
          }        
    });
});

整个源代码如下,

https://1drv.ms/u/s!AmISAco3PGaPhQl_Riu8nroCom5h

请帮我解决这个问题!

2 个答案:

答案 0 :(得分:0)

你有这一行:

foundCampground.comments.push(createdComment)

告诉mongodb将整个注释存储在数组中。

应该是这样的:

foundCampground.comments.push(createdComment._id)

只会将注释的id属性推送到数组中。

答案 1 :(得分:0)

该版本似乎有一个错误。 我更新它时问题得到解决。固定版本是5.0.3