如何查找与键子集匹配的文档

时间:2013-09-05 08:28:41

标签: couchdb

假设我们有以下数据结构:

{
   "name": "",
   "tags": []
}

使用以下示例数据:

{
   "name": "Test1",
   "tags": [
       "Laptop",
       "Smartphone",
       "Tablet"

   ]
}

{
   "name": "Test2",
   "tags": [
       "Computer",
       "Laptop",
       "Smartphone",
       "Tablet"

   ]
}

{
   "name": "Test3",
   "tags": [
       "Smartphone",
       "Tablet"
   ]
}

现在我想找到: 使用标签中的Smartphone和Tablet查找所有文档。这应该返回所有文件。

我无法弄清楚它如何与couchdb一起使用。我试图将标签添加为键,并使用startkey / endkey播放,但没有运气。

希望有人可以帮助我。

问候, 本

1 个答案:

答案 0 :(得分:1)

我看到两种可能的解决方案。你为什么没有像这样的地图函数的视图:

function(doc) {
   doc.tags && doc.tags.forEach(function(tag) {
      emit(tag, null);
   });
}

现在,如果您使用keys = [“Smartphone”,“Tablet”]查询此视图,您将获得以下行:

{id: "A", key: "Smartphone", value: null},
{id: "B", key: "Smartphone", value: null},
{id: "C", key: "Smartphone", value: null},
{id: "A", key: "Tablet", value: null},
{id: "B", key: "Tablet", value: null},
{id: "C", key: "Tablet", value: null}

现在,您必须在客户端很好地解析此响应,以过滤掉未显示查询所有键的ID。在这种情况下,所有文档(A,B,C)都会显示,因此这是您的结果。获得后,您可以使用批量获取来获取值:

POST http://...:../db/_all_docs?include_docs=true

with keys=["A", "B", "C"]

我就是这样做的。

您可以使用的第二种方法是使用map函数来发出doc.tags的所有可能子集。 (Find all possible subset combos in an array?)。使用这样的索引结构,您只需使用以下命令即可通过单个查询获取所需文档:

key=["Smartphone", "Tablet"] and include_docs=true. 

但是请记住,这意味着为您查看发出2 ** n(n个标签)行,因此只有在您确定每个文档只有少数几个文档时才使用此方法。