mongodb で行のバージョン管理を行うための適切な方法は何でしょうか。SQL サーバーには、データベース内で追跡された相対時間に基づいて行が更新されたときに自動的にインクリメントされる rowversion フィールドがありました。同じことに対するmongoの良いスキームがどのように見えるか疑問に思いますか?
1 に答える
SQL サーバーについて言及したような、MongoDB の行のバージョン管理に対する組み込みサポートはありません。
ただし、バージョン フィールドはいつでもドキュメントに追加できます。次に、ドキュメントを更新する必要があるときはいつでも、findAndModifyコマンドを使用してアトミックに更新します。このようなアトミックな更新ごとに、ドキュメントのバージョン番号もインクリメントする必要があります。たとえば、コレクションfoo
に document が含まれていたとします{ "_id" : "example", "a" : 3, "version" : 1 }
。次の例ではa
、フィールドをアトミックに 9 に設定し、mongo シェルを使用してバージョン番号をインクリメントします。
db.foo.findAndModify({
query: {_id: "example"},
update: {$set: {a: 9}, $inc: {version: 1}}
});
デフォルトでは、更新が適用される前の状態のドキュメントが返されます。ドキュメントの変更されたバージョンを返すには、クエリに追加new: true
します。
変更されたドキュメントのコピーが必要ない場合は、findAndModify の代わりに単に update を使用できることに注意してください (つまり、findAndModify は、1 つのアトミック ステップでドキュメントを更新して返すのに適しています。それ以外の場合は、update も同様に適しています)。