反向数组不保存在 NodeJS Mongoose MongoDB

Reversed array not saving in NodeJS Mongoose MongoDB

我正在使用 NodeJS 和 Mongoose 将数据存储到 MongoDB 数据库中。正如我所料,它大部分工作正常。

我有一个数组,作为架构的一部分,保存到 Mongoose 中的数据库文档中。它看起来像这样,在架构中:

var GameSchema = new mongoose.Schema({
    ...
    PlayerOrder: [Number],
    ...
}

当我调用 findOne(...) 从数据库中获取此文档时,它按预期工作,并且我得到了一个结果,比方说 ... [1,2,3,4] ....

然后,在成功执行 findOne(...) 时触发的回调中,我修改了一些值,包括 PlayerOrder 本身和其他值。在保存到数据库之前,我通过控制台验证是否对本地 GameModel 对象进行了更改。 其中一个更改是使用“game.PlayerOrder.reverse();”反转 PlayerOrder 数组。 然后我使用 GameModel.save(...) 函数。

以下是一些代码片段:

if (game.Turn >= game.PlayerCount) {
    console.log('Commuting to Phase 3.');
    game.Phase = 3;
    game.Turn = 0;
    // in phase 3, the player order is reversed; do that here
    console.log('player order before reverse: ' + game.PlayerOrder);
    game.PlayerOrder.reverse();
    // NOTE: this verifies that the array is correctly reversed in the model
    console.log('player order after reverse: ' + game.PlayerOrder);
}

game.save( function (err, game) {
    if (err) console.error(err);

    console.log('+ + + Execution successful; DB updated.');
});

然后,当我再次从数据库中提取同一个文档时,我所做的所有更改都在那里。换句话说,在提取文件后我可以看到我对文件元素所做的所有更改,例如玩家现金、游戏板状态等,都已正确完成,并保存在 save(...) 函数中。除了反向数组,由于某种原因它永远不会被修改。

为什么?

发生这种情况是因为当您使用 reverse().

时,Mongoose 无法跟踪数组中所做的更改

为了通知更改,使用markModified(),像这样:

if (game.Turn >= game.PlayerCount) {
    console.log('Commuting to Phase 3.');
    game.Phase = 3;
    game.Turn = 0;
    // in phase 3, the player order is reversed; do that here
    console.log('player order before reverse: ' + game.PlayerOrder);
    game.PlayerOrder.reverse();
    game.markModified('PlayerOrder'); // <== this line notifies Mongoose of the change

    // NOTE: this verifies that the array is correctly reversed in the model
    console.log('player order after reverse: ' + game.PlayerOrder);
}

关于此的更多信息,Mongoose FAQ 有一些答案。