【问题标题】:couchdb match multiple inconsistent keyscouchdb 匹配多个不一致的键
【发布时间】:2014-07-18 11:19:29
【问题描述】:

考虑以下两个文件:

{
   "_id": "a6b8d3d7e2d61c97f4285220c103abca",
   "_rev": "7-ad8c3eaaab2d4abfa01abe36a74da171",
   "File":"/store/document/scan_bgd123.jpg",
   "Commend": "Describes a person",
   "DateAdded": "2014-07-17T14:13:00Z",
   "Name": "Joe",
   "LastName": "Soap",
   "Height": "192cm",
   "Age": "25"
}

{
   "_id": "a6b8d3d7e2d61c97f4285220c103c4a9",
   "_rev": "1-f43410cb2fe51bfa13dfcedd560f9511",
   "File":"/store/document/scan_adf123.jpg",
   "Comment": "Describes a car",
   "Make": "Ford",
   "Year": "2011",
   "Model": "Focus",
   "Color": "Blue"
}

如何根据多个条件查找文档,例如“Make”="Ford" 和 "Color"="Blue"。我意识到我需要对此有一个视图,但我不知道键是什么,并且正如您从两个文档中看到的那样,键/值对并不一致。唯一一致的项目是“文件”键。

我正在尝试创建 couchDB 数据库来存储文件的位置,但使用键/值对进行标记。

编辑:

也许我应该重新考虑我的数据结构。稍微修改一下?

{
    "_id": "a6b8d3d7e2d61c97f4285220c103c4a9",
    "_rev": "1-f43410cb2fe51bfa13dfcedd560f9511",
    "File": "/store/document/scan_adf123.jpg",
    "Tags": {
        "Comment": "Describes a car",
        "Make": "Ford",
        "Year": "2011",
        "Model": "Focus",
        "Color": "Blue"
    }
}

所以,我需要通过标签中的 Key>Value 对或任意数量的 Key>Value 对来过滤我想要的文档。这里的问题是,我想用键>值对标记对象。这些标签在每个视图中可能会有很大的不同,因此下一个文档将有一组不同的 Key>Value 对。

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    Couchdb 支持灵活的模式。不需要文档保持一致就可以查询。您的方案的视图非常简单。这是应该可以解决问题的地图功能。

    function(doc){
    if(doc.Make&&doc.Color)
    emit([doc.Make,doc.Color],null);
    }
    

    这为您提供了一个视图,然后您可以像这样查询

    /view-name/key=["Ford","Blue"]&include_docs=true

    这应该会给你想要的结果。

    根据评论编辑

    为此,您将需要两个单独的视图。 couchdb 中的每个视图都旨在满足特定的查询需求。这意味着您必须考虑数据的访问策略。最初您需要做更多的工作,但由于麻烦,您会获得索引数据并且访问时间非常快的数据。

    所以直接回答你的问题。创建两个视图。一个用于 Make 就像我们已经完成的那样,另一个用于 Name 就像

    function(doc){
    if(doc.Name&&doc.LastName)
    emit([doc.Name,doc.Name],null);
    }
    

    现在,名称视图将只索引那些在其中具有名称的文档。 Make 视图将索引其中包含 make 的那些文档。

    如果将来出现您没有查询的需求时会发生什么?

    您可以尝试一些方法。

    1. 这可能是最简单的解决方案。使用couchdb-lucene 进行动态查询。在这种情况下,您的架构将类似于您知道应用程序需要的查询的 couchdb 视图。 Lucene 索引,用于您不知道可能需要的查询。因此,例如,您在 in couchdb 查询中索引了姓名和姓氏。但是出现了一个要求,您可能需要按年龄进行查询,然后只需将年龄字段转储到 lucene 中,剩下的就交给它了。

    2. 另一种方法是使用 PPP 技术,您可以利用创建视图是一次性成本这一事实,您可以在较少的活动时间创建视图,并在构建后将它们部署到生产服务中。

    3. 合并第 1 步和第 2 步! lucene 在您使用 ppp 技术构建视图时处理临时请求。

    【讨论】:

    • 泰阿克沙特。问题就在于此。该视图检查“Make”和“Color”是否存在,但是,下一个文档可能有一组完全不同的我希望匹配的键值对。例如,我提供的另一个文档有“Name”和“LastName”。这意味着,通过提供的视图,我不会将此文档与查询匹配。
    • 为您提供帮助。我对 noSQL 和 couchDB 非常陌生,来自 MySQL 背景,我仍在努力寻找自己的方向。所以相信我,当我说,我正在学习很多东西。我在原始问题中添加了更多信息。希望这有助于澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多