我正在尝试使用MongoDB,Mongoose,JQuery和Node.js构建应用程序 . 每当我尝试在我的Schema中添加一个数组时,它有时会多次添加该项 .
架构
这是我的架构,我正在尝试添加我的upvote和downvote数组,以跟踪由他们的id投票的用户 .
var SuggestionSchema = new mongoose.Schema({
title: String,
content: String,
link: String,
upvote: [{
user_id: {
type: Schema.ObjectId,
ref: 'User'
}
}],
downvote: [{
user_id: {
type: Schema.ObjectId,
ref: 'User'
}
}],
user_id: {
type: Schema.ObjectId,
ref: 'User'
},
category_id: {
type: Schema.ObjectId,
ref: 'Category'
},
});
路由和查询
这是我的放置路线和查询
router.put('/:suggestion_id/downvote', function(req, res, next) {
Suggestion.findByIdAndUpdate(
req.params.suggestion_id,
{$push: {"downvote": req.body}},
function(err, suggestion) {
res.json(suggestion);
})
});
使用Jquery调用Ajax
这是我在点击时触发的PUT请求 .
$('#downvote').click(function(){
var user = {
user_id: current_user._id
}
$.ajax({
url: current_url + "suggestions/" + current_suggestion + '/downvote',
type: 'PUT',
data: user,
success: function(data){
//callback
}
});
}
结果
还有两点需要注意:
控制台将返回:
无法加载资源:net :: ERR_EMPTY_RESPONSE
和
最终只需单击一次就会导致同一用户的2或3被推入Schema中的downvote数组 . 我在前端设置了一些保护措施来检查用户是否已经投票,但是它似乎仍然存在多次,所以我认为这是一个不同的问题 . 我相信我只是接近错误或缺少一些基本的东西 . 我只编写了6个月,所以我还在学习 . 谢谢!
1 回答
不使用$push运算符将用户id对象推送到downvote数组,而是使用$addToSet运算符 . 这会向数组添加一个值,除非该值已经存在,在这种情况下$addToSet对该数组不执行任何操作 . 它仅确保没有重复项添加到集合中,并且不会影响现有的重复元素 . 如果要更新的文档中不存在该字段,$addToSet将创建具有指定值作为其元素的数组字段 . 所以你的最终路线看起来像: