我遇到了与我的数据库重复写入的问题。 我有一个选择子句,每个(问题,用户)只应该强制执行一个答案,但不知何故,数组中仍有重复的答案。
此错误通过我们本地计算机上的测试,并且仅在具有大量用户的生产中发生。
基于mongo's docs,update
的原子性应该处理并发请求的测试和设置属性,但如果用户发送更多内容,则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,
},
},
},
},