更新Put请求,JQuery,MongoDB和Mongoose的问题

我正在尝试使用MongoDB,Mongoose,JQuery和Node.js构build应用程序。 每当我试图添加到我的架构内的数组有时会添加该项目多次。

架构

这是我的模式,我试图添加我的upvote和downvote数组,跟踪他们的id投票的用户。


     var SuggestionSchema = new mongoose.Schema({
      标题:string,
      内容:string,
      链接:string,
       upvote:[{
        用户名: {
        键入:Schema.ObjectId,
         ref:'User'
         }
       }],
       downvote:[{
        用户名: {
        键入:Schema.ObjectId,
         ref:'User'
         }
       }],
      用户名: {
        键入:Schema.ObjectId,
         ref:'User'
       },
       category_id:{
        键入:Schema.ObjectId,
         ref:'Category'
       },
     });

路线和查询

这是我的放置路线和查询


     router.put('/:suggestion_id / downvote',函数(req,res,next){
       Suggestion.findByIdAndUpdate(
       req.params.suggestion_id,
       {$ push:{“downvote”:req.body}},
      function(错误,build议){
         res.json(build议);
       })
     });

使用jquery调用Ajax

这是我点击触发的PUT请求。


 $( '#downvote')。点击(函数(){

     var user = {
         user_id:current_user._id
     }

     $就({
         url:current_url +“suggestions /”+ current_suggestion +'/ downvote',
        键入:“PUT”,
        数据:用户,
        成功:function(数据){
             //回电话
         }
     });         

 }

结果

还有两件事要注意:

控制台将返回:

无法加载资源:net :: ERR_EMPTY_RESPONSE

最终仅仅点击一次有时会导致同一用户的2个或3个被推入Schema中的downvote数组中。 我在前端设置了一些检查用户是否已经投票的保护措施,但似乎还是经历了多次,所以我认为这是一个不同的问题。 我相信我只是接近错误或错过了根本的东西。 我只有6个月的编码,所以我还在学习。 谢谢!

而不是使用$push操作符将用户id对象推送到downvote数组,请使用$addToSet操作符。 这会为数组添加一个值,除非该值已经存在,在这种情况下, $addToSet对该数组不做任何事情。 它只确保没有重复的项目被添加到集合中,并且不影响现有的重复元素。 如果该字段不存在于要更新的​​文档中, $addToSet创build具有指定值的数组字段作为其元素。 所以你最终的路线将如下所示:

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