更新模型实例

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

有:

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

我将整个表单通过ajax发送给控制器。
到目前为止,我知道两个select:

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

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

有没有一个好的,标准化的方式,我没有看到,要做到这一点?

谢谢

       

网上收集的解决方案 "更新模型实例"

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

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

该文件是相当自我解释,易于使用。 它基本上为你删除。 因此,您添加protected:true对您的模型,然后删除这些属性为您。 我喜欢这种方法,因为它仍然允许我使用req.body。 您也可以使用它来进行更新和插入。

第一种方法的一个变体是使用下划线的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首先设置的任何属性。