javascript – 更新Put Request,JQuery,MongoDB和Mongoose的问题

我正在尝试使用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,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
        }
    });         

}

结果

还有两点需要注意:

控制台将返回:

Failed to load resource: net::ERR_EMPTY_RESPONSE

最终只需单击一次就会导致同一用户的2或3被推入Schema中的downVote数组.我在前端设置了一些保护措施来检查用户是否已经投票,但它似乎仍然经历了多次,所以我认为这是一个不同的问题.我相信我只是接近错误或缺少一些基本的东西.我只编写了6个月,所以我还在学习.谢谢!

解决方法

不使用 $push运算符将用户id对象推送到downVote数组,而是使用 $addToSet运算符.这会向数组添加一个值,除非该值已经存在,在这种情况下,$addToSet对该数组不执行任何操作.它仅确保没有重复项添加到集中,并且不会影响现有的重复元素.如果要更新的文档中缺少该字段,$addToSet将创建具有指定值作为其元素的数组字段.所以你的最终路线看起来像:

router.put('/:suggestion_id/downVote',next) {
    Suggestion.findByIdAndUpdate(
        req.params.suggestion_id,{$addToSet: {"downVote": req.body}},suggestion) {
            res.json(suggestion);
        }
    );
});

相关文章

页面搜索关键词突出 // 页面搜索关键词突出 $(function () {...
jQuery实时显示日期、时间 html: <span id=&quot...
jQuery 添加水印 <script src="../../../.....
中文:Sys.WebForms.PageRequestManagerParserErrorExceptio...
1. 用Response.Write方法 代码如下: Response.Write(&q...
Jquery实现按钮点击遮罩加载,处理完后恢复 思路: 1.点击按...