【问题标题】:Mongoose findOne and save new document [duplicate]猫鼬findOne并保存新文档[重复]
【发布时间】:2016-07-30 00:12:11
【问题描述】:

我有一个包含“爱好”对象的用户列表。

User: {
   name: John Doe,
   hobby: {
     [{hobby_id: 77777, hobby_name: hockey, hobby_type: sports}],
     [{hobby_id: 88977, hobby_name: singing, hobby_type: talent}],
    }
   age: 27
}

现在我想找到一个用户并在列表中添加新的爱好。我的第一次尝试是:

 var user = User.findOne({ _id : req.body.user_id});

 User.update(user, { hobby: [{ hobby_name: req.body.name , 
                               hobby_type: req.body.type }] }, 
              function(err, user){
                if(err){
                  return res.status(500).json(err);
                }else{
                  return res.status(200).json(user);
                }
              });

但是,使用此代码,每次我调用该函数时,我的“新”爱好都会取代第一个。

我能做什么?

【问题讨论】:

  • 我可能是错的,但你的对象结构也似乎有点不对劲。应该更接近:用户:{名称:John Doe,爱好:[{hobby_id:77777,hobby_name:曲棍球,hobby_type:运动},{hobby_id:88977,hobby_name:唱歌,hobby_type:人才},]年龄:27 }
  • User.findOne 是一个异步操作,你不能在调用findOne 后立即使用user 对象,你应该在回调中这样做或使用承诺。因此你找不到用户,你的代码只是更新用户集合中的第一个对象。

标签: mongodb mongoose


【解决方案1】:

你可以使用下面的代码来做同样的事情。

User.findByIdAndUpdate(req.body.user_id, {$push:{ hobby: [{ hobby_name: req.body.name , 
                               hobby_type: req.body.type }] }}, {safe: true}
              function(err, user){
                if(err){
                  return res.status(500).json(err);
                }else{
                  return res.status(200).json(user);
                }
              });

这里的 findByIdAndUpdate 是查找和更新同一个文档。无需使用回调或承诺。请参考以下link

【讨论】:

    【解决方案2】:

    您的问题是您使用的是 repalce 语法,而不是 update 语法。我认为你需要:

    user.hobbies.push({ hobby_name: req.body.name , 
                               hobby_type: req.body.type })
    

    【讨论】:

      猜你喜欢
      • 2014-09-06
      • 2012-11-07
      • 2017-10-05
      • 1970-01-01
      • 2017-12-05
      • 2020-08-05
      • 2015-06-03
      • 1970-01-01
      • 2015-04-05
      相关资源
      最近更新 更多