假设我们有以下数据结构:
{
"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播放,但没有运气。
希望有人可以帮助我。问候, 本
答案 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个标签)行,因此只有在您确定每个文档只有少数几个文档时才使用此方法。