【问题标题】:Updating a model instance更新模型实例
【发布时间】:2013-02-21 01:56:25
【问题描述】:

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

拥有:

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

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

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

谢谢

【问题讨论】:

  • 致投反对票的人:至少你可以在评论中解释你的投票......

标签: node.js mongodb mongoose


【解决方案1】:

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

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

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

【讨论】:

  • 看起来很酷,认为它增加了一点开销,必须在任何地方更新我的代码才能使用 massAssign。
  • 哦,一个问题,文档中没有涉及到,你还需要删除body._id吗?
  • 您不必再删除任何内容,如果您问是否需要“保护” id,那么我的回答是,您也可以。我不认为这样做有什么害处....
【解决方案2】:

第一种方法的变体是使用下划线的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 删除您不希望用户能够设置的任何属性。

【讨论】:

  • 谢谢,但这种方式与我的第一种方法有同样的麻烦。最好有一个与extend相反的方法,即创建第三个对象,该对象仅具有与相同两个不同的属性
  • @AndréAlçadaPadez 不确定您对与第一种方法相同的麻烦是什么意思。您不再需要一一映射它们。
  • 我说的是第二种方法的麻烦,即删除方法
猜你喜欢
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 2018-04-26
  • 2022-01-04
  • 2021-01-04
  • 1970-01-01
相关资源
最近更新 更多