推送不在mongoose / mongodb阵列中工作

时间:2018-04-26 21:57:11

标签: node.js mongodb mongoose mongoose-schema

尝试创建一个简单的系统,用户可以在其中查看书籍但我一直收到错误的“推送”未定义。我曾多次尝试将新的评论推送到数据库,但每次都失败了。

我有一个猫鼬模型:

var WorkSchema = new mongoose.Schema({
    title: String,
    genre: String,
    workType: String,
    length: Number,
    ageRange: String,
    author: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User"
        },
        username: String
    },
    manuscriptText: String,
    workRating: [
        {
            reviewerName: String,
            critique: String,
            date: Date
        }
    ],
    ratingNumber: [Number],
    ratingSum: {
        type: Number,
        default: 0
    }
});

这是我的评论帖子,其中包含所有已注释失败的代码:

// post route for getting the review
router.post('/:id', function(req, res) {

    var critique = req.body.critique;
    var reviewerName = req.user.username;

    // find the right work associated with the critique
    Work.findById(req.params.id, function(err, foundWork) {
        if(err) {
            console.log(err);
        } else {

            // foundWork.workRating.reviewerName.push(reviewerName);
            // foundWork.workRating.critique.push(critique);
            // foundWork.workRating.date.push(Date());
            // foundWork.save();

            //     });
            // }
            // foundWork.update(
            //     {$push: {workRating: }
            //     }
            // );
            // {
            //     $push: {
            //         workRating: {
            //             reviewerName: reviewerName
            //             reviewerReview: critique
            //         }
            //         // ratingNumber: req.body.clickedValue,
            //         // $inc: {
            //         //     ratingSum req.body.clickedValue
            //         // }
            //     }
            // }
        }
    });
});

将这两个值放入该数组中,我做错了什么?

2 个答案:

答案 0 :(得分:0)

你正在做的事情有很多错误。 push是一个将元素添加到数组中的函数,reviewerNamecritiquedate都不是数组。这就是你看到.push is undefined的原因。

您尝试使用push workRating数组中的Work.update({_id :req.params.id }, {$push : {workRating : {reviewerName : "A", critique : "XYZ", date : "your_date"}}}) 对象更新文档。所以,这就是你这样做的方式

{{1}}

答案 1 :(得分:0)

所以你在尝试的错误位置有一些东西,还有更好的方法来处理这个

只需在模型上直接使用.updateOne(),而不是findById()

Work.updateOne(
  { "_id": req.params.id },
  { 
    "$push": {
      "workRating": { 
        "reviewerName": reviewerName,
        "critique": critique,
        "date": new Date()
      },
      "ratingNumber": req.body.clickedValue
    },
    "$inc": {
      "ratingSum": req.body.clickedValue
    }
  },
  function(err, response) {
   // handling
  }
)

.updateOne()是"首选"在现代API中,当你真正想要更新一个"文献。 update()方法执行相同的操作,只更新"第一个匹配",但它的使用被认为是"已弃用"过度使用更多"描述性"代码中的方法。

或者,如果您真的希望返回文档.findByIdAndUpdate()

Work.findByIdAndUpdate(req.params.id,
  { 
    "$push": {
      "workRating": {
        "reviewerName": reviewerName,
        "critique": critique,
        "date": new Date()
      },
      "ratingNumber": req.body.clickedValue
    },
    "$inc": {
      "ratingSum": req.body.clickedValue
    }
  },
  { "new": true },             // need to get the "modified" document
  function(err, foundWork) {
    // handling
  }
)

你的尝试中你基本上有错误的修饰符,而且简单地更新"它的效率要高得多。当你实际上不需要"获取"。

或者"不太好"模式"获取/修改/保存":

foundWork.workRating.push({
  "reviewerName": reviewerName,
  "critique": critique,
  "date": new Date()
});
foundWork.ratingNumber.push(req.body.clickedValue);
foundWork.ratingSum = foundWork.ratinSum + 1;

foundWork.save(function(err,modifiedWork) {
  // handling
});

你真的只是试图在错误的地方.push()

请注意,您还可以添加架构:

"date": { "type": Date, "default": Date.now }

这将自动将该值应用于此处的所有操作,因为mongoose将根据架构设置修改更新操作。