2014-04-24 77 views
2

我在做一個MMO實時瀏覽器遊戲,並使用Mongoose(MongoDB)存儲數據。無法使用Mongoose保存JavaScript對象

首先,我會告訴你我的對象的結構:

var playerSchema = new Schema({ name: { type: String, required: true, trim: true, index: { unique: true } }, resources: { wood: { type: Number, required: true, default: 500}, stone: { type: Number, required: true, default: 300}, iron: { type: Number, required: true, default: 0}, cereal: { type: Number, required: true, default: 0} }, resourcesPerHour: { woodPerHour: { type: Number, required: true, default: 40}, stonePerHour: { type: Number, required: true, default: 20}, ironPerHour: { type: Number, required: true, default: 0}, }, res: {type: Array, required:true, default: []}, buildings: { type: Array, required: true, default: []}, researches: { type: Array, required: true, default: []} });

正如你所看到的,resbuildingsresearches是數組。我要告訴你其中的一個(它們都具有相同的結構):

var buildingSchema = new Schema({ id: {type: String, requried: true}, name: { type: String, required: true, trim: true, index: { unique: true } }, level: { type: Number, required: true, default: 0}, scalingValue: {type: Number, required: true, default: 2}, costs: { wood: { type: Number, required: true, default:0}, stone: { type:Number, required:true, default:0}, iron: {type:Number, required:true, default:0}, cereal: {type:Number, required:true, default:0} } });

OK,想象我有一個播放器,所有數據initializated。當我嘗試更新某些內容時,我只能從該列表中更新信息。看看這個例子:

player.findOne({name:req.session.name}, function(err, doc){ doc.resources.wood -= 200; doc.buildings[id%100].costs.wood *= 2; doc.save(function(err){ if(err)console.log(err); }); }

當我看着數據庫模型,它只是存儲在resources.wood,而不是building[i].costs.wood。我不知道它爲什麼失敗,但陣列中的所有對象都是使用new variable創建的,其中variable是一個Schema(如buildingSchema)。

還有一件事,我在doc.save()之前加了一個console.log(doc.buildings[i].costs.wood);,沒關係。所以它意味着所有的數據都被修改得很好,但是在doc.save中它只保存'不在列表中'的數據。

編輯:console.log(err);不會打印任何東西,所以它意味着保存功能的工作。

回答

5

當您使用您的架構的Array類型(相同的docsMixed型),你需要明確標記字段修改或貓鼬也救不了你做出任何更改。

doc.markModified('buildings'); 
doc.save(function(err){ 
    if(err)console.log(err); 
}); 

更好的方法可能是申報buildings含有的buildingSchema數組:

buildings: [buildingSchema], 

這樣,貓鼬將能夠跟蹤您對buildings陣列自動變化。

+1

謝謝,'doc.markModified()'像一個魅力一樣工作。 – Neoares