2016-10-16 11 views
2

これは以前に尋ねられたことは分かっていますが、答えのどれも私のために働いていません。 私のアプリケーションでは、MongoDbにユーザーコレクションがあります。これらのユーザーコレクションには、フォーム内で変更できる「segActuacions」という名前の配列フィールドがあります。この形式は、ルータにこのオブジェクトを送信します。NodeJs/express/mongooseのオブジェクトからアイテムを削除するにはどうすればよいですか?

{ 
    "segActuacions.0.date": "27/09/2016", 
    "segActuacions.0.body": "first item", 
    "segActuacions.1.date": "27/09/2016", 
    "segActuacions.1.body": "second item" 
} 

ルータはコントローラに移動するには、このラインを持っている:

':id'User-idで、 ':i'はコントローラがこれを持っている segActuacions

の指標である

router.delete('/seg_act_upd_EE/:id/actDel/:i', 
    sessionController.loginRequired, 
    userController.actuaDelete 
); 

コード:

exports.actuaDelete = function (req, res) { 
    var userId = req.params.id; 
    var userI = req.params.i; 
    var usr = req.body; 

    delete usr['segActuacions.userI.date']; 
    delete usr['segActuacions.userI.body']; 

    models.User.findByIdAndUpdate(userId, usr, function (error, user){ 
     if (error) res.json(error); 
     res.redirect('/list_EE'); 
    }); 
} 

オブジェクトの'i'フィールドを削除したいとします(たとえば、if i=0"segActuacions.0.date""segActuacions.0.body"を削除しますが、何も起こりません)。

答えて

1

あなたは、単にからキーを削除するために探している場合

exports.actuaDelete = function (req, res) { 
    var userId = req.params.id; 
    var userI = req.params.i; 
    var usr = req.body; 

    delete usr["segActuacions."+ userI +".date"]; 
    delete usr["segActuacions."+ userI +".body"]; 

    models.User.findByIdAndUpdate(userId, usr, function (error, user){ 
     if (error) res.json(error); 
     res.redirect('/list_EE'); 
    }); 
} 

req.bodyオブジェクトと、その後は、この例に従う残りのキーを使用してコレクションを更新します

コレクションからフィールドを削除するには、deleteがオブジェクトからキーを削除し、更新されたオブジェクトでコレクションを更新してもコレクションの実際のフィールドは削除されないため、$unset演算子を使用することをお勧めします。

本質的には、削除するフィールドを正しく識別するためにdot notationを使用します。たとえば、次のmongoシェル更新操作を実現したいと思う:

db.users.update(
    { "_id" : userId }, 
    { 
     "$unset": { 
      "segActuacions.1.date" : "", 
      "segActuacions.1.body" : ""   
     } 
    } 
) 

これはsegActuacions配列のインデックス1との位置の要素からフィールドを削除します。お使いのコントローラメソッドでこのすべてを結びつける

、あなたはMMMM ...それはまだ動作しないよう

exports.actuaDelete = function (req, res) { 
    var userId = req.params.id; 
    var userI = req.params.i; 
    var usr = {}; 

    usr["segActuacions."+ userI +".date"] = ""; 
    usr["segActuacions."+ userI +".body"] = ""; 

    models.User.findByIdAndUpdate(userId, { "$unset": usr }, function (error, user){ 
     if (error) res.json(error); 
     res.redirect('/list_EE'); 
    }); 
} 
+1

はい、ついにそれは実際に働いた!!!私はドットと配列の表記の間に夢中になり、引用符について考えなかった。""あなたの説明のおかげで@chridam – cfibla

0

文字列としてuserIを使用していて、変数値を使用していないため、削除が機能しないことに注意してください。また、更新は、オブジェクト内のフィールドを更新するだけです。

しかし、私は、あなたが以下のように、$unsetを使うべきだと思う:

var updateObj = {}; 
updateObj['segActuacions'] = {}; 
updateObj['segActuacions'][userI] = {}; 
updateObj['segActuacions'][userI]['body'] = ''; 
updateObj['segActuacions'][userI]['date'] = ''; 

var update = { $unset: updateObj }; 

models.User.findByIdAndUpdate(userId, update, function (error, user){ 
    if (error) res.json(error); 
    res.redirect('/list_EE'); 
}); 

(このコードを向上させることができ、試験しなかった)

+0

として

{ "$unset": { "segActuacions.1.date" : "", "segActuacions.1.body" : "" } } 

に似て更新オブジェクトを構築することができますが、おかげであなたの興味のために@andresk – cfibla

+0

エラーメッセージが出ますか? – andresk

+0

いいえ、そうではありません。前と同じように、何も起こりません。 – cfibla

関連する問題