2017-11-08 16 views
0

「チャレンジ」コレクション内の文書を削除しようとしていますが、ユーザーがそのチャレンジの管理者ロールを持つ参加者リストにあるときだけです。Mongoose query - サブ文書の値で文書の条件を削除します。

現在のコードログchallenge deletedですが、チャレンジは実際には削除されません。ここで

は、チャレンジ・スキーマです:

Challenge.findOne({"_id" : req.params.challengeId, "participant" : { 
     $elemMatch : {participantID : req.user.id, participantRole : "admin"} 
    }}).remove(function(err, challenge){ 
     if (err){ 
      console.log(err); 
      res.redirect('/user/dashboard'); 
     } 
     if (!challenge){ 
      console.log("no challenge found"); 
      res.redirect('/user/dashboard'); 
     } 
     else { 
      console.log("challenge deleted"); 
      res.redirect('/user/dashboard'); 
     } 
    }) 
+0

「req.user.idd」とは何ですか?それは実際に文書の 'ObjectId'として格納される値ですか?もしそうなら、配列エントリ用のスキーマは設定されておらず、mongooseはその値を "自動キャスト"する方法を知らない。したがって '文字列'は異なる型であるため、 'ObjectId'と一致しません。 –

+0

そうです。だから私のモデルでは、参加者のための第2のスキーマを作成することができ、参加者はチャレンジスキーマの参加者ラインを参加者に置き換えることができます:{type:[participantSchema]、required:true}、 – GrepGrep

+0

あなたは ' participantSchema] 'を実行するか、参加者:[{participantID:Schema.Types.ObjectId、participantRole:String}]'や実際にどのフィールドを使用することもできます。ポイントは、リクエストパラメータの「文字列」に「キャスト」が必要な場合は、「自動キャスト」を許可するスキーマを定義するか、値をキャストします。 –

答えて

1

利用findOneAndRemove代わりのfindOne:

var challengeSchema = mongoose.Schema({ 
    name : {type: String, required: true}, 
    description : {type: String, required: true}, 
    startDate: {type: Date, required: true}, 
    endDate: {type: Date, required: true}, 
    creationDate: {type: Date, required: true}, 
    goalType : {type: String, required: true}, 
    goalAmount: {type: Number, required: true}, 
    participants : {type : [], required: true}, 
    categories : {type: [String], required: true} 
}); 

以下はChallengeがモデル変数であるクエリ、時現在の試みです。 Like:

Challenge.findOneAndRemove({"_id" : req.params.challengeId, "participant" : { 
    $elemMatch : {participantID : req.user.id, participantRole : "admin"} 
}},function(err, challenge){ 
    if (err){ 
     console.log(err); 
     res.redirect('/user/dashboard'); 
    } 
    if (!challenge){ 
     console.log("no challenge found"); 
     res.redirect('/user/dashboard'); 
    } 
    else { 
     console.log("challenge deleted"); 
     res.redirect('/user/dashboard'); 
    } 
}) 
+0

それはそうではありません。 'remove()'と 'findOneAndRemove()'も同じことをします。また、実際の問題点はすでに確認されています。 –

+0

これは、私のメソッドが予期せぬことを.remove()のコールバックに渡していたときに役立ちました。しかし、@ Neil Lunnが提案したように入れ子になったスキーマを修正する必要がありました。また、参加者の名前付けエラーをクエリフィルタの参加者に修正する必要がありました。ありがとうございました – GrepGrep

+0

It Was A Pleasure。 :) @GrepGrep –

関連する問題