Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose填充丢失阵列保存的更改_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript Mongoose填充丢失阵列保存的更改

Javascript Mongoose填充丢失阵列保存的更改,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,保存后填充时,我丢失了对Mongoose模型的一些更改,但不是全部更改。我在这里将一个随机变量拼接成数组中的第一个元素,并将其赋给另一个变量。目标activeTile和数组UnusedTile都在数据库中更新,但在填充调用中,我只看到目标的更新,而不是数组的更新 // Executing code console.log('==0> ' + gamestate.unusedTiles.length); console.log('==0> ' + gamestate.activeTil

保存后填充时,我丢失了对Mongoose模型的一些更改,但不是全部更改。我在这里将一个随机变量拼接成数组中的第一个元素,并将其赋给另一个变量。目标activeTile和数组UnusedTile都在数据库中更新,但在填充调用中,我只看到目标的更新,而不是数组的更新

// Executing code
console.log('==0> ' + gamestate.unusedTiles.length);
console.log('==0> ' + gamestate.activeTile.tile);
gamestate.nextTile(function(err, gamestate2) {
    console.log('==2>' + gamestate2.unusedTiles.length);
    console.log('==2>' + gamestate2.activeTile);
    gamestate2.populate('activeTile unusedTiles', function(err, gamestate3) {
        console.log('==3> ' + gamestate3.unusedTiles.length);
        console.log('==3> ' + gamestate3.activeTile);
    });
});

// And in the Mongoose model
var gamestateSchema = mongoose.Schema({
    unusedTiles: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Tile' }],
    activeTile: { type: mongoose.Schema.Types.ObjectId, ref: 'Tile' }
});

gamestateSchema.methods.nextTile = function(callback) { 
    var gamestate = this;
    gamestate.activeTile = gamestate.unusedTiles.splice(0, 1)[0];           
    gamestate.markModified('unusedTiles');
    gamestate.save(function(err, gamestate1) {
        console.log('==1> ' + gamestate1.unusedTiles.length);
        console.log('==1> ' + gamestate1.activeTile);
        callback(err, gamestate1);
    });        
}
生成的控制台输出如下所示:

==0> 65
==0> 5356b8907b915c0000e068a2
==1> 64
==1> 5356b8907b915c0000e06887
==2> 64
==2> 5356b8907b915c0000e06887
==3> 65
==3> {
       _id: 5356b8907b915c0000e06887,
       ... // rest of tile object
     }
我希望这两个更改都能在populate回调中看到。因此,unusedTiles数组的新长度应该是65而不是64。知道发生了什么吗


我正在使用Mongoose 3.8.1。

看起来我需要在填充之前将数组再次标记为已修改。我猜Mongoose会从数据库中取出旧数组用于填充,否则呢?这没有多大意义,因为填充是在save回调中完成的。不确定,但它正在处理这一变化

gamestate2.markModified('unusedTiles');