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

How to check for duplication before creating a new document in CouchDB/Cloudant?

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

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

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

目前的想法是:

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

2) 查询 de DB 以查找与该选择器匹配的任何文档,如果已存在任何符合这些条件的文档。

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

我也更愿意遵循最佳实践,而不是突然创建一些东西,但是我还没有找到针对这个特定场景的任何已知解决方案。

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

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

ID 可以是逻辑组合或从应该唯一的值计算的散列

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

头部/db/docId

returns 200-OK 如果 docId 存在于数据库中。

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

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

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

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

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

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

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

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

  • 定义一个视图,将每个文档的计算散列作为键发出

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

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

  1. Select 您希望保持唯一性的键
  2. 将值放入字符串中并生成散列
  3. 将文档的 _id 设置为该哈希值
  4. 将文档放入数据库。
  5. 检查 return 是否失败

如果数据库中已存在具有相同 _id 值的另一个文档,PUT 请求将失败。