更新模型实例

时间:2013-02-20 17:30:11

标签: node.js mongodb mongoose

我想了解更新模型实例的正确方法是什么,使用mongoose,即:

有:

User = {
   username: {
      type: String,
      indexed: true
   },
   email: {
      type: String,
      indexed: true
   },
   name: String,
   .........
};

我将整个表格通过ajax发送给控制器 到目前为止,我知道有两个选择:

app.put('/users/', function(req, res){
   var id = ObjectId(req.body._id);
   User.findOne({_id: id}, function(err, user){
       user.name = req.body.name;
       ....
       ....
       user.save();
   });
});

或:

app.put('/users/', function(req, res){
    var id = ObjectId(req.body._id);
    delete req.body._id
    User.update({_id: id}, req.body, function(err){
         .....
    };
});

两种方式都有缺点:
在第一种方法中,我必须逐个映射所有属性;
在第二种方法中,我必须删除所有无法更改的属性;
有第三种可能的方法可以让我从客户端发送,只有更改的属性,但我认为这将是一个很大的麻烦。

有没有一种好的,标准化的方式,我没有看到,这样做?

由于

2 个答案:

答案 0 :(得分:2)

这是我通常使用的方法,它涉及一个名为mongoose-mass-assignement的小型npm包:

https://github.com/bhelx/mongoose-mass-assignment

文档非常自我解释,易于使用。它基本上为你做删除。因此,您将protected:true添加到模型中,然后为您删除这些属性。我喜欢这种方法,因为它仍然允许我按原样使用req.body。您也可以将其用于更新和插入。

答案 1 :(得分:1)

第一种方法的变体是使用下划线的extend方法将主体的所有属性应用于模型实例:

app.put('/users/', function(req, res){
   var id = ObjectId(req.body._id);
   User.findOne({_id: id}, function(err, user){
       _.extend(user, req.body);
       user.save();
   });
});

但是,请务必删除您不希望用户首先从req.body设置的任何属性。