Michael Lorton
Michael Lorton

Reputation: 44436

How do you guarantee the uniqueness of a field in a CouchDB document?

Just what it says on the tin. I have a bunch of (say) Member documents, I want each user to be able to set the Email field on his document to whatever he wants, example an Email that exists on another document. If I just do a check-insert, I'm vulnerable to a race condition. Is there some idiom for "locking" or inserting-then-checking?

Upvotes: 3

Views: 283

Answers (2)

Robert Newson
Robert Newson

Reputation: 4631

As the other answer notes, the only field guaranteed to be unique in CouchDB is _id.

You might borrow a trick from the replicator here. In order to fast-forward a second replication between the same two hosts, it writes a checkpoint document which records the update sequence it last reached. But how does it find the checkpoint document in the future? Like so;

"_id": md5(source.host + source.port + target.host + target.port)

A general pattern can be extracted where your unique fields form part of the id itself. Running them through md5 guarantees a fixed length identifier.

In your case, you could just use email address as your id.

Changing one of these fields is a two step process, but one that still maintains the uniqueness property.

  1. Copy the document to its new id (http://wiki.apache.org/couchdb/HTTP_Document_API#COPY)
  2. If successful, delete the old one (http://wiki.apache.org/couchdb/HTTP_Document_API#DELETE)

A crash between steps 1 and 2 will leave the old document it place, so you may wish to add a reference to the old document in the new document. You can then create a view of those back references and perform a clean up sweep periodically.

All that said, CouchDB deliberately only supports only one unique field, as opposed to a typical RDBMS which can support elaborate relational constraints, in order for a solution to scale up cleanly in a cluster (c.f, BigCouch). In your case, where email address must be unique, much of what I've said should work (email addresses don't change that often), but obviously this is swimming upstream to a degree.

HTH, B.

Upvotes: 1

Henrik Barratt Due
Henrik Barratt Due

Reputation: 5814

The only sure way is to create a doc with the unique value as doc id.

Upvotes: 2

Related Questions