代码之家  ›  专栏  ›  技术社区  ›  bobbyrne01

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

  •  0
  • bobbyrne01  · 技术社区  · 8 年前

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

    文件 Cloudant db:

    1.

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

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

    目前,我有 view 定义 云雀 并设置 include_docs 参数设置为true,因此返回整个对象(这是必需的)。。

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

    并将呼叫 看法 使用。。

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

    使用 keys 参数设置为: ['/'] ,因此视图返回上面的两个文档。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Glynn Bird    8 年前

    你的解决方案很好。创建一个索引,其键是数组中的键,这是检索包含已知值的文档的完美方法。一个小的迭代是emit 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,以获得更快的响应。