我正在做一个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
。我不知道为什么会失败,但是数组中的所有对象都是使用new variable
创建的,其中variable
是一个Schema(如buildingSchema
)。
还有一件事,我在console.log(doc.buildings[i].costs.wood);
之前添加了doc.save()
,这没关系。所以它意味着所有数据都被修改得很好,但在doc.save
它只保存'not-in-list'数据。
编辑:console.log(err);
不会打印任何内容,因此这意味着保存功能有效。
答案 0 :(得分:5)
在架构中使用Array
类型时(与docs中的Mixed
类型相同),您需要明确将字段标记为已修改或Mongoose不会保存你对它做出的任何改变。
doc.markModified('buildings');
doc.save(function(err){
if(err)console.log(err);
});
更好的方法可能是将buildings
声明为包含buildingSchema
的数组:
buildings: [buildingSchema],
通过这种方式,Mongoose将能够自动跟踪您对buildings
数组所做的更改。
答案 1 :(得分:1)
https://groups.google.com/forum/#!topic/mongoose-orm/5m7ZPkhFyrc
mongoose不支持不在数组内的子文档。我的建议是完全删除mongoose,只使用对db的直接查询。您会发现节点本机驱动程序非常易于使用。