Mongodb更新路径会产生冲突

时间:2018-02-19 10:20:50

标签: javascript node.js mongodb mongoose

我试图插入新的竞争对手,如果不存在,否则只更新它,但我得到以下错误:

(node:4628) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): MongoError: Updating the path 'competitors' would create a conflict at 'competitors'

这是关于竞争对手的模型:

competitors : [
{
    userid: {type: String, default: 'x'},
    amount:  {type: Number, default: 0},
    reward:  {type: Number, default: 0},

}

],

这是正在运行的代码段,但失败并重现代码

 var newInsertMent = {userid: user._id, amount: 0};
                return Competition_global.findOneAndUpdate(
                    {"competitors.userid": user._id, _id: globalCompetition._id},
                    { $addToSet: {"competitors": newInsertMent}, $inc: {"competitors.$.amount": amount}},
                    {upsert: true,new: true}
                    ).then(function (competitionUpdate) {
                    console.log(competitionUpdate);
                    return competitionUpdate;
                });

问:我在这里做错了什么,为什么会造成冲突呢?

2 个答案:

答案 0 :(得分:1)

我在最近的项目中试图完成同样的事情,但遇到了同样的错误。 我用两个查询解决了我的问题

首先,让我们找到存在的用户并存储结果

  let result = Competition_global.findOne(
{"competitors.userid": user._id, _id: globalCompetition._id}
  });

如果没有找到用户,则使用结果,然后将新用户对象推送到竞争对手数组中

  if (result === null) {
    let result = await Competition_global.insertOne(
      {
        $push: {
         // your new user data
        },
      }
    );
  } 

else 更新用户数量

else {
    let result = await Competition_global.updateOne(
      {"competitors.userid": user._id, _id: globalCompetition._id},
      {
          $inc: {"competitors.$.amount": amount},
      }
    );
  }
});

答案 1 :(得分:0)

这是猫鼬(可能是mongodb)的已知问题#7003