0

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

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

使用以下示例数据:

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

   ]
}

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

   ]
}

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

现在我正在尝试查找:在标签中查找所有带有 Smartphone AND Tablet 的文档。这应该返回所有文件。

我无法弄清楚这如何与 couchdb 一起使用。我尝试将标签添加为键并使用 startkey / endkey 没有运气。

希望有人可以帮助我。

问候,本

4

1 回答 1

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 的所有可能子集。(查找数组中所有可能的子集组合?)。使用这样的索引结构,您可以通过单个查询获得所需的文档,只需使用:

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

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

于 2013-09-05T08:47:53.700 回答