我在做一个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: []} });
正如你所看到的,res
,buildings
和researches
是数组。我要告诉你其中的一个(它们都具有相同的结构):
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);
不会打印任何东西,所以它意味着保存功能的工作。
谢谢,'doc.markModified()'像一个魅力一样工作。 – Neoares