反向数组未保存在NodeJS Mongoose MongoDB中



我使用NodeJS和Mongoose将数据存储到MongoDB数据库中。正如我所料,它基本上运行良好。

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

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

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

然后,在成功执行findOne(...)时触发的回调中,我修改了一些值,包括PlayerOrder本身和其他值。在通过控制台保存到DB之前,我验证了对本地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(...)函数中。除了反向数组,由于某些原因,它永远不会被修改。

为什么?

发生这种情况是因为Mongoose无法跟踪使用reverse()时在数组中所做的更改。

为了通知更改,请使用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常见问题解答有一些答案。

最新更新