如果文档包含数组 属性 中的值,则从 cloudant db 检索文档

Retrieve documents from cloudant db if they contain a value in an array property

这就是我目前的做法,有没有更好(性能更高或更简单)的方法?

Cloudant 数据库中的文档:

1 ..

{
  "_id": "someId",
  "_rev": "someRev",
  "title": "someTitle",
  "parentDirectories": [
    '/', '/base_dir'
  ]
}

2 ..

{
  "_id": "someId2",
  "_rev": "someRev",
  "title": "someTitle2",
  "parentDirectories": [
    '/', '/base_dir'
  ]
}

目前,我在 Cloudant 中定义了这个 view 并将 include_docs 参数设置为 true 以便返回整个对象(这是必需的)..

function (doc) {
  if (doc.parentDirectories) {
    for (i = 0; i < doc.parentDirectories.length; i++) {
      emit(doc.parentDirectories[i], {_id: doc._id});
    }
  }
}

并且会使用 ..

调用 view
/<database>/_design/<design-doc>/_view/my_view?include_docs=true

使用 keys 参数设置为:['/'],因此查看 returns 以上 2 个文档。

你的解决方案很好。创建一个索引,其键是数组中的键是检索包含已知值的文档的完美方法。一个小的迭代是发出 null 作为值,因为您无论如何都在查询时检索整个文档(使用 include_docs=true):

function (doc) {
  if (doc.parentDirectories) {
    for (i = 0; i < doc.parentDirectories.length; i++) {
      emit(doc.parentDirectories[i], null);
    }
  }
}

您还可以发出文档的一个子集:

function (doc) {
  if (doc.parentDirectories) {
    for (i = 0; i < doc.parentDirectories.length; i++) {
      emit(doc.parentDirectories[i], doc.title);
    }
  }
}

意味着您可以避免使用 include_docs=true,以获得更快的响应。