重复写入mongo

时间:2017-10-25 09:22:32

标签: mongodb meteor

我遇到了与我的数据库重复写入的问题。 我有一个选择子句,每个(问题,用户)只应该强制执行一个答案,但不知何故,数组中仍有重复的答案。

此错误通过我们本地计算机上的测试,并且仅在具有大量用户的生产中发生。

基于mongo's docsupdate的原子性应该处理并发请求的测试和设置属性,但如果用户发送更多内容,则doc的events数组中仍有重复的条目而不是一个请求。

这是我的代码:

playerAnswer(qId, aId) {
  Game.update(
    {
      $and: [
        { _id: this._id },
        {
          gameLog: {
            $not: {
              $elemMatch: {
                nameType: eventTypes.QuestionEnd,
                questionId: qId,
              },
            },
          },
        },
        {
          gameLog: {
            $elemMatch: {
              nameType: eventTypes.QuestionStart,
              questionId: qId,
            },
          },
        },
        {
          gameLog: {
            $not: {
              $elemMatch: {
                nameType: eventTypes.PlayerAnswer,
                playerId: Meteor.userId(),
                questionId: qId,
              },
            },
          },
        },
        {
          gameLog: {
            $elemMatch: {
              nameType: eventTypes.PlayerReg,
              playerId: Meteor.userId(),
            },
          },
        },
        {
          'quiz.owner': { $ne: Meteor.userId() },
        },
      ],
    },
    {
      $push: {
        gameLog: new PlayerAnswer({
          playerId: Meteor.userId(),
          questionId: qId,
          answerId: aId,
        }),
      },
    },
  );
  const isEveryoneAnswered = Game.findOne(this._id).isAllPlayerAnsweredToQuestion(qId);
  return isEveryoneAnswered && this.questionEnd(qId);
}

正如您从代码中看到的那样,只有当用户没有发送回复时,用户才能发送回答:

{
   gameLog: {
     $not: {
       $elemMatch: {
         nameType: eventTypes.PlayerAnswer,
         playerId: Meteor.userId(),
         questionId: qId,
       },
     },
   },
 },

0 个答案:

没有答案