Can';t使用Mongoose保存JavaScript对象

Can';t使用Mongoose保存JavaScript对象,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在做一个MMO实时浏览器游戏,我正在使用Mongoose(MongoDB)存储数据 首先,我将向您展示我的对象的结构: var playerSchema=新模式({ 名称:{type:String,必需:true,trim:true,索引:{unique:true}, 资源:{ wood:{type:Number,必需:true,默认值:500}, stone:{type:Number,必需:true,默认值:300}, iron:{type:Number,必需:true,默认值:0}, 谷

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

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

var playerSchema=新模式({
名称:{type:String,必需:true,trim:true,索引:{unique:true},
资源:{
wood:{type:Number,必需:true,默认值:500},
stone:{type:Number,必需:true,默认值:300},
iron:{type:Number,必需:true,默认值:0},
谷物:{type:Number,必需:true,默认值:0}
},
资源中心:{
woodPerHour:{type:Number,必需:true,默认值:40},
stonePerHour:{type:Number,必需:true,默认值:20},
ironPerHour:{type:Number,必需:true,默认值:0},
},
res:{type:Array,必需:true,默认值:[]},
建筑物:{type:Array,必需:true,默认值:[]},
查询:{type:Array,必需:true,默认值:[]}
});

如您所见,
res
建筑物
、以及
研究
都是数组。我将向您展示其中一个(它们都具有相同的结构):

var buildingSchema=新模式({
id:{type:String,requuried:true},
名称:{type:String,必需:true,trim:true,索引:{unique:true},
级别:{type:Number,必需:true,默认值:0},
缩放值:{type:Number,必需:true,默认值:2},
费用:{
wood:{type:Number,必需:true,默认值:0},
stone:{type:Number,必需:true,默认值:0},
iron:{type:Number,必需:true,默认值:0},
谷物:{type:Number,必需:true,默认值:0}
}
});

好的,假设我有一个播放器,所有数据都已初始化。当我尝试更新某些内容时,我只能更新列表中的信息。看看这个例子:

player.findOne({name:req.session.name},函数(err,doc){
doc.resources.wood-=200;
文档建筑[id%100]。costs.wood*=2;
单据保存(功能(错误){
if(err)console.log(err);
});
}

当我在数据库上查看模型时,它只存储
资源.wood
,而不是
建筑[I]。costs.wood
。我不知道它为什么会失败,但数组中的所有对象都是使用
新变量创建的,其中
变量
是一个模式(如
buildingSchema

还有一件事,我在
doc.save()
之前添加了一个
console.log(doc.buildings[I].costs.wood);
这表示所有数据都可以修改,但在
doc.save
中,它只保存“不在列表中”的数据

编辑:
console.log(err);
不打印任何内容,因此它意味着保存功能工作。


mongoose不支持不在数组中的子文档。我的建议是完全删除mongoose,只使用对db的直接查询。您会发现节点本机驱动程序非常易于使用。

当您在模式中使用
数组
类型时(与中的
混合
类型相同),您需要显式地将该字段标记为已修改,否则Mongoose不会保存您对其所做的任何更改

doc.markModified('buildings');
doc.save(function(err){
    if(err)console.log(err);
});
更好的方法可能是将
建筑
声明为包含
建筑模式
的数组:

buildings: [buildingSchema],
这样,Mongoose将能够自动跟踪您对
建筑物
阵列所做的更改