考虑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”的所有文档?
我希望以前没有问过/回答过这样的问题。我搜索它并找不到。
答案 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。