我正在尝试使用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); }) });
这是我点击时触发的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个月,所以我还在学习。谢谢!
答案 0 :(得分:1)
使用$push
运算符,而不是使用$addToSet
运算符将用户ID对象推送到downvote数组。这会向数组添加一个值,除非该值已经存在,在这种情况下$addToSet
对该数组不执行任何操作。它仅确保没有重复项添加到集中,并且不会影响现有的重复元素。如果要更新的文档中不存在该字段,$addToSet
将创建具有指定值作为其元素的数组字段。所以你的最终路线看起来像:
router.put('/:suggestion_id/downvote', function(req, res, next) {
Suggestion.findByIdAndUpdate(
req.params.suggestion_id,
{$addToSet: {"downvote": req.body}},
function(err, suggestion) {
res.json(suggestion);
}
);
});