CouchDB と MongoDB の比較 #3 ドキュメントで予約されたフィールド
CouchDBもMongoDBも、それぞれのドキュメントに対して一意キーである_idフィールドを持つようです。いずれも、ドキュメントの追加時に自動的にサーバー側で(UUID 32文字)付与させるか、クライアントから指定することができるようです(TODO: Mongo でもクライアントから指定できるかどうかは未検証)。
一方、CouchDBでは、_rev というドキュメントの衝突管理のための版番号を持ちます。版番号はドキュメントの更新履歴に対して一意のため、
- ドキュメントを取得
- 変更を実施
- ドキュメントを更新
の操作において、1の後、3をコミットする前に、他のクライアントによってドキュメントが更新されてしまった場合には、3. で送信する_revとDB上の_revが不一致のため、更新に失敗する、という仕組みを提供します。Optimistic Lockです。
一方で、MongoDBは「指定した条件にマッチしたドキュメントを更新する」というAPIを持っているので、_rev のような仕組みがなくても、同様のことは実施できます。これについては、「Atomic Operations」に記載があるようです。"Update if Current" の項が参考になります。
まとめます。
項目 | CouchDB | MongoDB |
---|---|---|
ドキュメントの一意性 | _id で保証 | _id で保証 |
更新衝突検出 | _rev を使ったOptimistic Lock | なし /「指定した条件にマッチしたドキュメントを更新する」ことでOptimistic Lockが実現できる |
_rev はレプリケーションの衝突検出にも使うので、これについてはあとでまた調べます。