2017-10-16 6 views
-1

私はmongobのデータベースクエリをmongoシェルに入れずにconsole.log()したいと思います。以下は私のコードです。関連する部分は太字で示しています。mongodbデータベースのクエリをmongoシェルではなくコンソールに記録する方法を教えてください。

router.put('/quotes/:id', (req, res, next) => { 
    let personToUpdate = req.params.id; 
    **console.log("old name: " + JSON.stringify(db.collection("quotes").findOne({ _id: ObjectId(personToUpdate) })));** 
    db.collection("quotes").findOneAndUpdate( 
    { _id: ObjectId(personToUpdate)}, 
    {$set: { 
     name: req.body.name 
     } 
    }, function (err, object) { 
     if (err) { 
     console.warn(err.message); 
     } else { 
     **console.log("new name: " + req.body.name);** 
     } 
    } 
); 
}); 

私が試みた:

console.dir()が、戻り[オブジェクト、オブジェクト]ことを。 私はprint()とprintjson()を試しましたが、それらはmongo shell exclusiveコマンドです。

最終的な結果は、put要求によってユーザーが名前を変更したときに、まずデータベースに格納されている古い名前をコンソールに記録し、次にfindOneAndUpdate()mongodbコマンドの最後で変更することです名前を入力すると、ユーザーがreq.body.nameを通じて送信した新しい名前がログに記録されます。

+0

なぜ非同期呼び出しの結果を記録していますか? – lilezek

+0

なぜそれが問題なのか分かりません。ロギング( "新しい名前:" + req.body.name)はうまくいきます。私の難しさは、変更が行われる前に、データベースに現在保存されているログに古い名前を取得することです。 –

+0

'findOne'の動作をお読みください:http://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html#findOne –

答えて

2

findOneは非同期なので、結果を得るためにコールバックを提供し、残りのコードをそのコールバックに入れる必要があります元の文書を入手した後でなければ更新は行われません。

ただし、元のドキュメントはfindOneAndUpdateコールバックにデフォルトで渡されるため、findOneコールを削除して元の名前を取得できます。

router.put('/quotes/:id', (req, res, next) => { 
    let personToUpdate = req.params.id; 
    db.collection("quotes").findOneAndUpdate( 
    { _id: ObjectId(personToUpdate)}, 
    {$set: { 
     name: req.body.name 
     } 
    }, function (err, result) { 
     if (err) { 
     console.warn(err.message); 
     } else { 
     console.log("old name: " + result.value.name); 
     console.log("new name: " + req.body.name); 
     } 
    } 
); 
}); 
+0

あなたは信じられないほどです!どうもありがとうございます! –

関連する問題