我正在使用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(...)
函数中。对于反转数组,除了某些原因永远不会被修改。
为什么?
答案 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有一些答案。