nodejs / mongoose更新文件中的“多级”值/不能设置属性

我有一个“用户”集合,有一些字段(名称,名字,login名,密码…)

我想将用户名和密码保存在名为“local”的子文档中(对于本地连接,将来我可以有一个名为“facebook”或“google”的子文档…)

那么,这里是mongo中的一个文档的结构:

db.User.find(){ "__v": 0, "_id": ObjectId("5342b25940bcab2d1d71e04a"), "active": true, "address": "juddegaass, 2A", "api_key": "3cead67add74395ce4d1dfcdd3ea4979", "city": "Kehlen", "country": "LU", "create_date": ISODate("2014-04-07T14:12:41.104Z"), "credit": 0, "email": "admin@company.com", "firstname": "Admin", "lastname": "Istrator", "local": { "email": "admin@company.com", "password": "$2a$08$Y7GorE3UhceNhPzvAdv7X.wDNxp80snHdng0hq9r1AePqRW1iHU5i" }, "role": "su", "uptade_date": ISODate("2014-04-07T14:12:41.104Z"), "zip": "8281" } 

我有一个表单来更新用户,我的问题是当我提交这个表单。 我得到一个错误:

 TypeError: Cannot set property 'email' of undefined 

这是我的节点用户映射器中的更新function:

 var toUpdate = {}; if (data.firstname) toUpdate.firstname = data.firstname; if (data.lastname) toUpdate.lastname = data.lastname; if (data.email) { toUpdate.email = data.email; toUpdate.local.email = data.email; } if (data.password !== '') toUpdate.local.password = user.generateHash(data.password); if (data.role) toUpdate.role = data.role; ... if (data.apiKey) toUpdate.api_key = data.apiKey; if (data.active) toUpdate.active = data.active; dbUser.update({'_id' : data.id}, toUpdate, {upsert : true}, function (err) { if (err) return callback(new Error(err)); callback(null, data.id); }); 

当然,我可以声明“本地”子对象,但是如果我声明它,密码值将被删除。

您的评论清楚地表明,您可能已经在该项目的数据库中有条目。 当你使用mongoose时,正确的更新方法是首先将它从数据库中取出,然后保存。

 dbUser.findbyId(data.id, function(err, user){ if(err){ return callback(err); } if(!user){ user = new dbUser(); } if (data.firstname) user.firstname = data.firstname; //...// if(data.email){ user.local = user.local || {}; user.local.email = data.email; } if(data.password !== '') { user.local = user.local || {}; user.local.password = dbUser.generateHash(data.password); } user.save(callback); });