无法使用Mongoose保存JavaScript对象

Neo*_*res 2 javascript mongoose mongodb node.js

我正在做一个MMO实时浏览器游戏,我正在使用Mongoose(MongoDB)存储数据.

首先,我将向您展示我的对象的结构:

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} } });

好吧,想象一下我有一个播放器,初始化了所有数据.当我尝试更新某些内容时,我只能更新该列表中的信息.看这个例子:

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.我不知道它为什么会失败,但是数组中的所有对象都是使用a创建的new variable,其中variable是Schema(如buildingSchema).

还有一件事,我console.log(doc.buildings[i].costs.wood);在前面添加了一个doc.save(),它没关系.因此,它意味着所有数据都被修改得很好,但在doc.save它中只保存了"非列表中"数据.

编辑:console.log(err);不打印任何内容,因此这意味着保存功能有效.

Joh*_*yHK 5

当您Array在架构中使用类型(与文档中Mixed类型相同)时,您需要将字段明确标记为已修改,或者Mongoose不会保存您对其所做的任何更改.

doc.markModified('buildings');
doc.save(function(err){
    if(err)console.log(err);
});
Run Code Online (Sandbox Code Playgroud)

更好的方法可能是声明buildings为包含以下数组buildingSchema:

buildings: [buildingSchema],
Run Code Online (Sandbox Code Playgroud)

这样,Mongoose将能够自动跟踪您对buildings阵列所做的更改.