我希望在单个couchdb实例上具有绝对原子性(插入,如果已经存在则失败)

时间:2011-01-07 08:36:47

标签: couchdb

我真的很喜欢用于组织和更新数据的couchdb风格,但是在某些情况下我真的需要能够创建一个条目并确定在返回之前是否已经存在等效条目用户。对我的应用程序来说绝对必要的唯一情况是用户注册。将所有用户注册写入特定的指定couchdb实例(称为“registration-instance”),我没问题。

我想将user_id哈希到一些要使用的_id中。然后使用此_id执行put,但如果已插入_id则失败。我需要向用户返回已保留用户名的用户,之后我无法检测到冲突并在此时解决,因为用户会认为他们已保留用户名。

我不明白为什么couchdb 无法提供某种方法来执行此操作,假设您指定特定“类型”文档的插入始终路由到特定实例

1 个答案:

答案 0 :(得分:2)

如果您向单个CouchDB服务器发送新用户文档的PUT请求,您应该已经获得了您想要的行为。

如果文档不存在,那么它将创建新文档。

如果文档存在,则保证返回409冲突错误。这是因为您没有提供_rev属性,因为您没有尝试更新预先存在的文档。

只有当_id和_rev属性匹配时,CouchDB才会更新现有文档。

您可能还想阅读文档更新处理程序: http://wiki.apache.org/couchdb/Document_Update_Handlers

您可以使用更新处理程序对user_id进行哈希并动态分配相应的_id。您还可以自定义沙发使用更新处理程序发送的错误响应类型。

祝你好运!