【问题标题】:How to find documents which match a subset of keys如何查找与键子集匹配的文档
【发布时间】:2013-09-05 08:28:40
【问题描述】:

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

{
   "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 没有运气。

希望有人能帮帮我。

您好, 本

【问题讨论】:

    标签: couchdb


    【解决方案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 - 标记数)行供您查看,因此只有在您确定每个文档只有少数行时才使用此方法。

    【讨论】:

    • 感谢您的回答。今天已经通过谷歌找到了您的解决方案。认为这个问题还有另一种解决方案。还找到了“couchdb lucene 项目”,但是如果你有很多文档,这可能真的效率很低。
    猜你喜欢
    • 2017-08-21
    • 2014-08-24
    • 2014-10-24
    • 2018-08-20
    • 2019-01-10
    • 1970-01-01
    • 2019-05-06
    • 2019-07-16
    • 1970-01-01
    相关资源
    最近更新 更多