Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 猫鼬模型';s save()是否缺少一些值?_Mongodb_Mongoose - Fatal编程技术网

Mongodb 猫鼬模型';s save()是否缺少一些值?

Mongodb 猫鼬模型';s save()是否缺少一些值?,mongodb,mongoose,Mongodb,Mongoose,我带着一件可能发生在开发人员身上的最糟糕的事情来到这里,我发现了一个无法重现的bug 我正在做一个排名游戏。 我有一个toumannt模型,它包含了所有参与游戏的玩家。 每5分钟我就保存一次比赛的模型 TounamentModel: { Players: [ { _user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, points: { type: Number, required: true, default: 0 } }

我带着一件可能发生在开发人员身上的最糟糕的事情来到这里,我发现了一个无法重现的bug

我正在做一个排名游戏。 我有一个
toumannt模型
,它包含了所有参与游戏的玩家。 每5分钟我就保存一次比赛的模型

TounamentModel: {
  Players: [ { _user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, points: { type: Number, required: true, default: 0 } } ]
}
一切都很好,但在大约50名玩家之后,我开始观察一些更新,这些更新不会增加一些玩家的分数(每次游戏结束后,我都会在锦标赛模型中增加玩家的分数)

我首先想到“如果一个玩家在自动保存过程中增加他的点数,这可能不起作用,也许我们必须等到保存的回调”,但我写了一个简短的循环,表明这不是真的:

var User = new Docs['User']();
    for (var i=0; i<100; i++) {
        User.points += 10;
        if (i === 50)
            User.save();
    }

    setTimeout(function() {
        User.save();
        console.log('Finally: '+User.points); // Prints 1000 as expected
    }, 10000);
var User=newdocs['User']();

对于(var i=0;iyou正在执行绝对值的User.save(),这不是原子更新,因此如果两个线程尝试对同一用户执行save(),其中一个线程不会覆盖另一个用户的save吗?我猜您应该使用带有$inc运算符的更新。实际上,如果您执行$inc(),save会做正确的事情你使用的猫鼬版本是什么?看起来它的行为和操作符在2到3之间发生了变化。