2014-05-02 2 views
0

Я теряю некоторые (но не все) изменения в моей модели Mongoose при заполнении после сохранения. Я соединяю случайный (здесь упрощенный просто первый) элемент из массива и назначаю его в другую переменную. И target (activeTile), и массив (unusedTiles) обновляются в базе данных, но в запросе заполнения я вижу обновления только целевому, а не массиву.Mongoose populate lost array Сохраненные изменения

// 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 
    } 

Я ожидаю, как изменения, которые будут рассматриваться в заселить обратного вызова. Таким образом, новая длина массива unusedTiles должна быть не 65, а 64. Любая идея, что происходит?

Я использую Mongoose 3.8.1.

ответ

0

Похоже, мне нужно было пометить массив как измененный снова непосредственно перед заполнением. Я предполагаю, что Mongoose извлекает старый массив из базы данных для заполнения в противном случае? Это не имеет большого смысла, поскольку заполнение выполняется в обратном вызове сохранения. Не уверен, но он работает с этими изменениями.

gamestate2.markModified('unusedTiles');