gpt4 book ai didi

node.js - 推送在 mongoose/mongodb 数组中不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 01:50:05 25 4
gpt4 key购买 nike

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

我有一个 Mongoose 模型:

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
// // }
// }
// }
}
});
});

我把这两个值放入该数组到底做错了什么?

最佳答案

因此,您在尝试时遇到了一些错误的地方,并且还有更好的方法来处理此问题

只需使用 .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 将根据架构设置修改更新操作。

关于node.js - 推送在 mongoose/mongodb 数组中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50052418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com