1

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

有:

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

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

有没有一种我没有看到的好的、标准化的方式来做到这一点?

谢谢

4

2 回答 2

2

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

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

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

于 2013-02-20T17:56:25.647 回答
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

于 2013-02-20T17:47:53.760 回答