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

时间:2010-09-06 12:41:27

标签: couchdb

考虑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"]
}

我想查询包含 ALL (不是任何!)标记的所有文档作为密钥。

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

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

这似乎非常低效,我认为必须有更好的方法。

我的第二个问题 - 但我认为它们非常相关 - 会是:

如何查询包含“tag2” AND “tag3” AND “otherTag3”的所有文档?

我希望以前没有问过/回答过这样的问题。我搜索它并找不到。

1 个答案:

答案 0 :(得分:1)

你有最大数量吗?

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

如果是这样,您在要编制索引的最大标记数上有一个上限。例如,每个文档最多包含5个标记,AND查询中允许使用5个标记,您只需将每1,2,3,4和5个标记组合输出到索引中,最多 1 (五标记组合+ 5 (四标记组合)+ 10 (三标记组合)+ 10 (该文档视图中的双标记组合)+ 5 (单标记组合) = 31 行。

考虑到它是一个非常强大的查询,你可能会接受。磁盘使用情况可能是可以接受的(特别是如果你只是emit(tags, {_id: doc._id})来最小化视图中的数据,你可以使用?include_docs=true来获取完整的文档。最后要记住的是始终发出密钥数组排序,并始终以相同的方式查询,因为您只发出标记组合,而不是排列

这可以让你到目前为止,但它无法无限扩大。对于完整的任意AND查询,您确实需要拆分成多个查询,否则请查看CouchDB-Lucene。