我有两个数据库,其中某些文档具有相同的“ _id”值,例如唯一ID。但是我为返回409客户端错误的第二个数据库创建文档:冲突冲突文档更新冲突。
with Document(whitelist_dbname, id) as document:
current_time = dt.datetime.now().isoformat()
if document.exists():
print 'Update whitelist item "{0}"'.format(id)
document['type'] = 'id'
document['expired_date'] = whitelist_item['expiry']
document['contact'] = whitelist_item['contact']
document['updated_time'] = current_time
document.save()
else:
print 'Creating whitelist item "{0}"'.format(id)
new_item = {
'_id': id,
'type': 'id',
'contact': whitelist_item['contact'],
'expired_date': whitelist_item['expiry'],
'created_time': current_time,
'updated_time': current_time,
}
whitelist_dbname.create_document(new_item, throw_on_exists=False)
在运行此python代码之前,我的数据库whitelists
具有相同的_id值。
答案 0 :(得分:1)
一般而言,Cloudant文档中的_id字段对于包含它的数据库必须是唯一的。如果选择创建自己的_id序列(这是要做的一件事),则您有责任确保它确实是唯一的。对于给定的数据库,这可能很好,但是如果要在两个(或多个)数据库之间进行复制,则可能会变得复杂。现在,_id序列在所有副本中必须是唯一的。
您实际上并没有提供能够提供帮助的必要信息-您的代码不是我们需要查看的,我们需要查看数据。
Cloudant确保同一数据库中的两个不同文档不可能具有相同的_id。
请注意,冲突(409)比这更微妙。更新冲突是对一致性的破坏。 Cloudant文档还具有修订ID, _rev 。更新现有文档时,需要同时提供_id和_rev,以准确规定要更新的文档版本。回想一下,Cloudant文档实际上是修订的树(有点像git存储库)。
这意味着Cloudant仅允许您更新叶修订。如果您尝试更新内部(非叶子)修订,您的请求将被409拒绝。
这是文档树以及如何操作它的很好的入门书:
https://dx13.co.uk/articles/2017/1/1/the-tree-behind-cloudants-documents-and-how-to-use-it.html