Mongoose findByIdAndUpdateが正しいモデルを返さない


99

MongooseのfindByIdAndUpdateがコールバックで正しいモデルを返さないという、以前に見たことのない問題があります。

これがコードです:

    var id = args._id;
    var updateObj = {updatedDate: Date.now()};
    _.extend(updateObj, args);

    Model.findByIdAndUpdate(id, updateObj, function(err, model) {
        if (err) {
            logger.error(modelString +':edit' + modelString +' - ' + err.message);
            self.emit('item:failure', 'Failed to edit ' + modelString);
            return;
        }
        self.emit('item:success', model);
    });

dbの元のドキュメントは次のようになります。

{
    _id: 1234
    descriptors: Array[2],
    name: 'Test Name 1'
}

入力されるupdateObjは次のようになります。

{
    _id: 1234
    descriptors: Array[2],
    name: 'Test Name 2'
}  

コールバックから返されたモデルは、updatedObjではなく、元のモデルと同じです。データベースにクエリを実行すると、正しく更新されています。データベースから返されていないだけです。

これは「愚かなユーザー」のエラーのように感じますが、私にはわかりません。どんなアイデアでも大歓迎です。


1
それは素晴らしい場所です。また、パッケージが独自の単体テストに合格しているため、すべてのプロジェクトをバージョンに合わせておく必要がある理由を思い出させてください。ありがとうございました。
JonRed

回答:


294

Mongoose 4.0では、(および)のnewオプションのデフォルト値がに変更されました(リリースノートの#2262を参照)。つまり、更新が適用された後、新しいバージョンのドキュメントを取得するには、オプションを明示的に設定する必要があります。findByIdAndUpdatefindOneAndUpdatefalsetrue

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...

5
また、 'create'メソッドの戻り値の変更に引っかかっています。よろしくお願いします。できれば2回賛成投票します。
JonRed

4
また、マングースプロジェクトの更新されたドキュメントのPRを送信します。そうすれば、他の人を見つけられないでしょう。
JonRed

3
ああ少年ありがとう@JohnnyHK。これは私を壊滅させました。もちろん新しいものが欲しいです。APIとの整合性はより高いかもしれませんが、実際には常識ではありません...何かを更新した場合、変更を確認します。マングースに感謝します...
Peege151

21
うわー!彼らが作ったなんて恐ろしい決定です!これが、更新ではなく最初に検索を行う唯一のポイントです。
Adam Lockhart

9
誰かではなく、代わりに新しいの応答の古い文書だろう、なぜ私は理解していない
emilioriosvz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.