1

Mongoose を使用して、モデル インスタンスを更新する正しい方法を理解したいと思います。

持つ:

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

フォーム全体をajax経由でコントローラーに送信しています。
これまでのところ、私は2つのオプションを知っています:

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

どちらの方法にも欠点があります。
最初のアプローチでは、すべてのプロパティを 1 つずつマップする必要があります。
2 番目のアプローチでは、変更できないすべてのプロパティを削除する必要があります。
変更されたプロパティのみをクライアント側から送信する3番目の可能なアプローチがありますが、それは非常に面倒だと思います。

これを行うために、私が見ていない標準化された良い方法はありますか?

ありがとう

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 に答える