在NodeJS Mongoose MongoDB中不保存的反向数组

时间:2015-03-22 19:13:28

标签: mongoose

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

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

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.');
});

然后,当我再次从DB中提取相同的文档时,我所做的所有更改都在那里。换句话说,在拉动文档之后,我可以看到我对文档元素所做的所有更改(例如玩家现金,游戏板状态等)都已正确制作,并保存在save(...)函数中。对于反转数组,除了某些原因永远不会被修改。

为什么?

1 个答案:

答案 0 :(得分:1)

这是因为当您使用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有一些答案。