我想了解更新模型实例的正确方法是什么,使用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){
.....
};
});
两种方式都有缺点:
在第一种方法中,我必须逐个映射所有属性;
在第二种方法中,我必须删除所有无法更改的属性;
有第三种可能的方法可以让我从客户端发送,只有更改的属性,但我认为这将是一个很大的麻烦。
有没有一种好的,标准化的方式,我没有看到,这样做?
由于
答案 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
设置的任何属性。