如何在CouchDB / Cloudant中创建新文档之前检查重复?

时间:2018-01-30 19:20:20

标签: couchdb cloudant couchdb-mango

我们想要检查数据库中是否已存在与我们尝试保存的新对象的相同字段和值相同的文档,以防止重复项目。

注意:此问题与更新文档或重复文档ID无关,我们只检查数据以防止使用现有文档保存新文档。

我们最好使用Mango / Cloudant查询来完成此操作,而不是依赖于视图。

到目前为止的想法是:

1)扫描我们要保存的数据,并动态创建与该文档结构匹配的选择器。 (我们不能对选择器进行硬编码,因为我们有许多类型的文档)

2)查询de DB with for匹配该选择器的任何文件,如果已存在符合这些标准的任何文件。

但是我想知道这种方法的性能,因为许多选择器字段都不会被索引。

我更倾向于遵循最佳实践,而不是创造出一些突然出现的东西,但是我们无法找到针对这种特定情况的任何已知解决方案。

如果你碰巧知道,请分享。

2 个答案:

答案 0 :(得分:0)

选项1 - 为文档定义有意义的ID

ID可以是逻辑上的coposition,也可以是来自应该唯一的值的计算哈希

如果要检查文档ID是否已存在,可以使用HEAD方法

HEAD / db / docId

如果docId退出数据库,则返回200-OK。

如果您想检查新文档和上一个文档中是否有相同的内容,可以使用允许比较两个文档的Validate Document Update Function

function(newDoc, oldDoc, userCtx, secObj) {
...
}

选项2 - 使用CouchDB外部计算的内容哈希

  • 在创建或更新文档之前,应使用应该唯一的属性值计算哈希值。

  • 哈希在新属性中包含在文档中,即" key_hash"

  • 使用" key_hash"创建芒果索引属性

  • 当应插入新文档时,应计算哈希值,并在插入文档之前使用芒果表达式查找具有相同哈希值的文档。

选项3 - 在视图中计算哈希

  • 定义一个视图,将每个文档的计算哈希值作为键

    发出
  • 在创建新文档之前,您应该使用之前需要计算的哈希来查询视图。

答案 1 :(得分:0)

一个解决方案是将Juanjo和Alexis的评论更进一步。

  1. 选择您希望保持唯一的密钥
  2. 将值放在字符串中并生成哈希
  3. 将文档的_id设置为该哈希值
  4. 将文档放在数据库中。
  5. 检查返回失败
  6. 如果数据库中已存在具有相同_id值的其他文档,则PUT请求将失败。