尝试创建一个简单的系统,用户可以在其中查看书籍但我一直收到错误的“推送”未定义。我曾多次尝试将新的评论推送到数据库,但每次都失败了。
我有一个猫鼬模型:
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
// // }
// }
// }
}
});
});
将这两个值放入该数组中,我做错了什么?
答案 0 :(得分:0)
你正在做的事情有很多错误。 push
是一个将元素添加到数组中的函数,reviewerName
,critique
或date
都不是数组。这就是你看到.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将根据架构设置修改更新操作。