javascript - nodejs/mongoose 更新文档中的 "multi level"值/无法设置属性

标签 javascript node.js mongodb mongoose

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

我想将用户和密码存储在名为“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

这是我的 Node 用户映射器中的更新函数:

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

关于javascript - nodejs/mongoose 更新文档中的 "multi level"值/无法设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22915882/

相关文章:

javascript - 如何在node.js程序中记录每个 "throw"?

arrays - Node +蒙戈: adding record to array inside collection

javascript - 以 AngularJS 的方式向 MongoLab 添加一个新的模型字段

c - 我在编译 c 使用 mongodb c 驱动程序时遇到错误 "undefined reference to ` mongo_client'"

javascript - 为什么带有 async/await 的 Array.map() 返回奇怪的结果?

javascript - 新的 Apple 页面如何在图像中淡出?

node.js - 在 Node JS 请求中发送未解析的数据

javascript - node.js 错误 : req. flash() 需要 session

c# - MongoDb:用ruby插入UUID后,c#无法将其转换为GUID

javascript - 如何从angularjs访问变量express