反向数组不保存在 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 有一些答案。
我正在使用 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()
.
为了通知更改,使用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 有一些答案。