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

用CouchDB查询包含两个标记的文档?

  •  1
  • Huxi  · 技术社区  · 15 年前

    请考虑CouchDB中的以下文档:

    {
      "name":"Foo1",
      "tags":["tag1", "tag2", "tag3"],
      "otherTags":["otherTag1", "otherTag2"]
    }
    
    {
      "name":"Foo2",
      "tags":["tag2", "tag3", "tag4"],
      "otherTags":["otherTag2", "otherTag3"]
    }
    
    {
      "name":"Foo3",
      "tags":["tag3", "tag4", "tag5"],
      "otherTags":["otherTag3", "otherTag4"]
    }
    

    我想查询所有包含 全部 (不是任何!)作为键的标记。

    例如,如果我使用'[“tag2”,“tag3”]'请求,我想检索Foo1和Foo2。

    我目前通过按标记查询,首先是“tag2”,然后是“tag3”,然后手动创建联合。

    这似乎效率极低,我想肯定有更好的方法。

    我的第二个问题——但我认为它们很相关——应该是:

    如何查询包含“tag2”的所有文档 以及 “标签3” 以及 “其他标签3”?

    我希望这样的问题以前没有人问过/回答过。我找了找,没找到。

    1 回复  |  直到 15 年前
        1
  •  1
  •   JasonSmith    15 年前

    你有最大数量吗?

    • 每个文档的标签,以及
    • 查询中允许的标记

    如果是这样的话,就有了要索引的最大标记数的上限。例如,如果每个文档最多有5个标记,并且and查询中允许有5个标记,则可以简单地将每个1、2、3、4和5个标记的组合输出到索引中,最多可以输出5个标记 1 (五个标签组合+ (四个标记组合)+ (三个标记组合)+ 10 5 (一个标记组合) =31 该文档的视图中的行。

    考虑到这是一个非常强大的查询,这可能是您可以接受的。磁盘使用量是可以接受的(尤其是如果您 emit(tags, {_id: doc._id}) 若要最小化视图中的数据,则可以使用 ?include_docs=true 以便稍后获取完整的文档。最后要记住的是始终发出排序的键数组,并始终以相同的方式查询它,因为您只发出标记 组合 ,不是 .

    这可以让你到目前为止,但它不会无限扩大。对于全面的任意查询和查询,您确实需要拆分成多个查询,或者查看CouchDB-Lucene。