Cloudant中的视图是否可以在不属于其关键字的参数上进行过滤

时间:2014-04-25 12:03:26

标签: couchdb cloudant

我希望能够从视图中搜索发布的文档,在不属于其生成的字段上搜索,而是通过链接文档添加的字段。

As explained in the docs

如果这些是我的记录: [ { "_id": "11111" , "name": "pandora" }, { "_id": "22222", "ancestors": ["11111"], "value": "hello" }, { "_id": "33333", "ancestors": ["22222","11111"], "value": "world" } ]

并且观点是这样的:

    function(doc) {
    if (doc.value) {
    emit([doc.value, 0], null);
    if (doc.ancestors) {
      for (var i in doc.ancestors) {
        emit([doc.value, Number(i)+1], {_id: doc.ancestors[i]});
      }
    }     

是否可以通过对'name'进行排序来搜索返回的文档?

2 个答案:

答案 0 :(得分:0)

很遗憾,您无法搜索链接的文档。它们链接到发出的couchdb文档。 include_docs参数只为您提取与_id对应的文档。视图按键排序,只能通过发出的键进行过滤。

构建couchdb视图时,将对从视图发出的键进行排序。在您的情况下,文档将在value上排序,您只能使用key=some-value过滤结果。但是,您可以发出复杂​​的json键,如{value:doc.value,name:doc.name},并查询名称和值。

与您的问题无关,但cloudant有一个沙发数据库lucene,可用于涵盖各种复杂的查询场景。

答案 1 :(得分:0)

我以双视图的方式做你的建议。

查看1 - 查找要获取文档的名称_id

您需要做的就是发出带有名字的文件。在emit函数中,您将发出名称作为键,将doc._id作为值。输出看起来像这样:

   key: "pandora", value: [11111]

如果您有多个具有相同名称的ID,则可能需要减少此值。

查看2 - 创建每个文档所需的输出_id

第二种观点更复杂。您可以为每个文档发出一个值并存储“#”位置'通过使用具有空值的数组。这看起来像这样:

    id 22222: key: 11111, value: ["hello"]
    id 33333: key: 22222, value: ["world"] 
    id 33333: key: 11111, value: ["","world"]

假设每个键和数组位置最多只有一个已定义/非空的条目,您的reduce函数可以将其减少为:

    key: 11111, value: ["hello","world"]
    key: 22222, value: ["world"]

表现关注

您提到名称每15秒更新一次。您的文档看起来很小,因此每天大约6k更新对我来说不是问题。但是,您应该考虑以下事项:

  • 视图索引会在您请求时更新,而不是在文档更新时更新。
  • 您的观点应首先检查他们是否可以驳回该文件。您可以使用" name"在视图2和带有"值"的文档中在视图1中。
  • 我不确定您访问视图的频率,但您可以在两个视图中使用参数,以便立即获得所需的文档。
  • 您可以考虑使用陈旧的视图(这意味着视图将在返回最后一组结果后重新编制索引),因此在您第一次查询视图时,很少有响应可能会过时更新后。