9

たとえば、ドキュメントがあるとします。 var doc = Model.findOne({name:"name"});

ドキュメントがデータベースへの別の接続を介して編集されると、ドキュメントは正しい情報を保持しません。必要なので、データベースから「更新」または「再ダウンロード」する必要があります。オブジェクト「doc」のみでこれを行う方法はありますか?

4

3 に答える 3

7

リフレッシュするドキュメントインスタンスが含まれていると仮定するとdoc、これを実行して一般的にリフレッシュできます。

doc.model(doc.constructor.modelName).findOne({_id: doc._id},
    function(err, newDoc) {
        if (!err) {
            doc = newDoc;
        }
    }
);

ただし、Mongoose ドキュメント インスタンスは、差し迫った必要性を超えて永続化/キャッシュしない方がよいでしょう。_idドキュメント自体ではなく、すばやくアクセスする必要がある不変のドキュメントをキャッシュします。

于 2012-12-19T22:14:57.847 に答える
2

申し訳ありませんが、これが古いことはわかっていますが、他の誰かがまだ見回している場合に備えて、より良い解決策があります。

同じドキュメントに同時にアクセスするこの状況でできることは、通常の保存を実行することです。

Mongoose は、オブジェクトの __v プロパティを使用して、古いインスタンスが最新のインスタンスを上書きしないようにします。

したがって、doc.__v = 0 のインスタンスが 2 つあり、A が最初に保存する場合、データベースには doc.__v = 1 が含まれるようになります。したがって、B が保存するとエラーになり、B.__v = 1 ではなく 0 になるためです。次にできることは、エラーをキャッチし(特定のマングースエラーである必要があります)、オブジェクトを更新して処理し(__v = 1に上げる必要があります)、必要に応じて保存するか保存しないかのいずれかですする。

だからコードで

doc.save(function (err, _doc) {
    if (err) {
        if (err.some_error_property_telling_you_version_was_wrong) {
            // Do your business here 
            // Refresh your object
            // Model.findById(doc._id, function (err, _refreshed_doc) {});
            // doc = _refreshed_doc;
            // doc.set('property', value); set the value again
            // Then re-save? or maybe make this a recursive function,
            // so it can keep trying to save the object?
        } else {
            // Handle it like a normal error
        }
    }
});  
于 2016-02-26T17:26:37.270 に答える