【发布时间】:2019-10-08 17:18:31
【问题描述】:
在基于 express 的 node.js 服务器中,通过 mongoose 与 mongo db 交互,我想仅当用户(由他的 id 标识)尚未查看时在“reviews”数组上插入“review”产品,否则,更新之前插入的评论。 给定以下 mongo 方案:
产品:
var ProductSchema = new Schema({
ownerId: {
type: Schema.ObjectId,
required: 'Owner of recharge point required'
},
name: {
type: String,
required: 'The name is required'
},
description: {
type: String
},
reviews: {
type: [Review]
}
});
评论:
var ReviewSchema = new Schema({
reviewerId: {
type: ObjectId,
required: 'Reviewer id required',
ref: 'User' <not showed>
},
review: {
type: String
},
date: {
type: Date,
default: Date.now
}
});
这是我想出的结果,但这只是插入新评论,还没有更新它们。 我认为我的解决方案可以改进(和简化)很多。
exports.review_product = function (req, res) {
const review = req.body.review;
const reviewerId = req.body.reviewerId;
const productId = req.params.productId;
Product.findOne({_id: productId}, function(error, result){
if(error) {
res.status(500).send({message: error}).end()
} else if(result){
var newReview = new Review({ reviewerId: reviewerId, review: review});
Product.findOneAndUpdate({ _id: productId, 'reviews.reviewerId': { $ne: reviewerId }},
{ $push: { 'reviews': newReview}},
function(error, found) {
if (error) {
res.status(500).send({message: error}).end()
} else if(found) {
res.status(200).send({message: 'Review succefully added.'}).end()
} else {
res.status(404).send({message: 'You already reviewed this product'}).end()
}
});
} else {
res.status(404).send({message: 'Cannot find the product to be reviewed.'}).end()
}
})
};
【问题讨论】:
标签: javascript mongodb mongoose