Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript nodejs/mongoose更新a“;“多层次”;文档中的值/无法设置属性_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript nodejs/mongoose更新a“;“多层次”;文档中的值/无法设置属性

Javascript nodejs/mongoose更新a“;“多层次”;文档中的值/无法设置属性,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有一个“用户”集合,其中包含一些字段(名称、名字、登录名、密码…) 我想将用户和密码存储在名为“local”的“子文档”中(对于本地连接,将来我可以有一个名为“facebook”或“google”的子文档…) 下面是mongo中文档的结构: db.User.find(){ “_v”:0, “_id”:ObjectId(“5342b25940bcab2d1d71e04a”), “主动”:正确, “地址”:“Juddegaas,2A”, “api_键”:“3cead67add74395ce4d1d

我有一个“用户”集合,其中包含一些字段(名称、名字、登录名、密码…)

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

下面是mongo中文档的结构:

db.User.find(){
“_v”:0,
“_id”:ObjectId(“5342b25940bcab2d1d71e04a”),
“主动”:正确,
“地址”:“Juddegaas,2A”,
“api_键”:“3cead67add74395ce4d1dfcdd3ea4979”,
“城市”:“凯伦”,
“国”:“鲁”,
“创建日期”:ISODate(“2014-04-07T14:12:41.104Z”),
“信用”:0,
“电子邮件”:admin@company.com",
“firstname”:“Admin”,
“lastname”:“IStrotor”,
“本地”:{
“电子邮件”:admin@company.com",
“密码”:“$2a$08$Y7GorE3UhceNhPzvAdv7X.wdnxp80snhdng0hq9r1aepqrw1hu5i”
},
“角色”:“su”,
“上升日期”:ISODate(“2014-04-07T14:12:41.104Z”),
“zip”:“8281”
}
我有一个表单来更新用户,我的问题是当我提交此表单时。我有一个错误:

TypeError: Cannot set property 'email' of undefined
这是“我的节点用户映射器”中的更新功能:

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

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

您的评论清楚地表明,您可能已经在数据库中拥有此项的条目。在使用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); 
});

谢谢你的回答,但问题是一样的。toUpdate.local=toUpdate.local |{};将在“toUpdate”中创建“local”子对象,因为此时toUpdate{}不存在,password属性及其值将丢失。我想到了这个解决方案。。。我想这样试试。泰达姆,它工作得很好!在mongo中,save也可以进行更新。。。谢谢你向我学习:)