2017-05-15 9 views
0

私のfindOneAndUpdate操作で文書が見つかったかどうかを調べようとしています。そうでない場合、404エラーが見つかりません。私は、Mongooseが提供する "passRawValue"オプションを使用して、未処理の値があるかどうかを調べることにしました。rawが未定義の場合、ドキュメントが見つかりませんでした。Mongoose findOneAndUpdateが生のMongoレスポンスを返さない

ただし、ドキュメントが見つかったかどうかにかかわらず、生の値は未定義です。私は更新しようとしているドキュメントが、更新の直前に単純な "findOne"クエリを実行することによって、クエリの時点でDBにあることを確認しました。どこが間違っていますか?

let updateItemById = (userId, itemId, params, cb) => { 

//this finds and prints the document I'm testing with -- I know its in the DB 

    // Item.findOne({ "_id" : itemId, ownerId: userId }, (err, doc) => { 
    // if (doc) { 
    //  console.log("This is the doc: ", doc); 
    // } 
    // }); 

    Item.findOneAndUpdate({ "_id" : itemId, ownerId: userId }, 
    { 
     $set: { 
     params 
     } 
    }, { runValidators: 1, passRawResult: true}, (err, doc, raw) => { 

    if (err) { 
     //winston.log 
     return cb(ErrorTypes.serverError(), false); 
    } 
    else if (raw) { 
     return cb(null, true); 
    } 
    else { 
     return cb(ErrorTypes.notFound(), false); 
    } 

    }); 
} 

答えて

0

こんにちは私は、データベース内の文書に存在しない性質を持っているのparamsを渡している予感を持っています。このような場合、何も変更されていないため、dbは3番目のパラメータとしてrawを返しません。

更新:

だから私は自分自身のいくつかのいくつかのテストをした、と私たちはオプション厳しい渡す場合ことを確認:偽を、あなたのコードが意図したとおりに動作するはずです。だからあなたのオプションのセクションでは、この

{ runValidators: 1, passRawResult: true, strict: false, new:true} 

説明のようになります。

マングースは、デフォルトでtrueですstrict optionを持っています。更新される値がスキーマで定義されていることを確認します。したがって、[mongoose documentation](http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate)に記載されているように、厳密なオプションをfalseに指定すると、新しいフィールドでドキュメントを更新することができます。

また、新しい:trueオプションを追加すると、更新されたドキュメントが返されます。

P.S.私はそれが一致するものが見つからない場合、それはドキュメントのためにnullを返します新しいドキュメントを挿入しないだろう、とあなたはその上の簡単なチェックをすることができますを意味し、私たちのアップサートがfalseであるため、しかし追加したい

。なぜあなたは生のことをチェックしているのですか?これには特別な理由はありますか?

+0

ああ、もしそうなら、どのようなアプローチになるだろうか? My Itemオブジェクトには、更新で設定できるオプションのプロパティがあります。これは私の使用例です。 –

+0

したがって、オプションのプロパティはスキーマに定義されていませんか? –

+0

こんにちは、更新されたセクションを確認してください。 –

関連する問題