查询沙发数据库中的映射键/值对

时间:2016-04-25 09:47:48

标签: couchdb

我一直在阅读有关沙发数据库视图(http://wiki.apache.org/couchdb/HTTP_view_API#HTTP_View_APIhttp://www.barkingiguana.com/2009/01/22/filtering-and-ordering-couchdb-view-results/)的文档,但我找不到我要找的内容,而且我&# 39;我开始认为它不受支持。

我在沙发数据库中有两条记录

{
   "_id": "UUID",
   "_rev": "rev",
   "status": "complete",
   "csv": [
           {
               "Lower": 0.09,
               "Upper": 0.31
           }
    ],
    "tags": {
       "get_info": {
           "duration": "24",
           "location": "south"
       }
   }
}

{
   "_id": "2-UUID",
   "_rev": "2-rev",
   "status": "complete",
   "csv": [
           {
               "Lower": 0.01,
               "Upper": 0.70
           }
    ],
    "tags": {
       "different_info": {
           "duration": "60",
           "location": "south"
       }
   }
}

是否可以创建一个视图并添加查询参数,这些参数将返回所有具有标记" key":" value" (例如,我想要标记所有记录"持续时间":24或者我想要标记所有记录" location":" south")。我不想将任何键/值硬编码到视图中 - 它们应该与查询一起传递。

还有另一种思考方式吗?这不是一种观点吗?

1 个答案:

答案 0 :(得分:1)

实现此目的的一种方法是使用[ key, value ]将视图中的所有标记作为数组发出:

function (doc) {
  for (var type in doc.tags) {
    for (var tag in doc.tags[type]) {
      emit([ tag, doc.tags[type][tag] ]);
    }
  }
}

您可以使用特定对查询您的视图:key=["duration","24"]。您还可以使用startkeyendkey进行远程搜索。

如果您选择POST,则可以指定密钥列表:keys[]=["duration","24"]&keys[]=["location","south"]。但是,使用此方法,您将无法进行远程搜索。 (至少atm)

当查询这样的多个键时,您将获得与任何键匹配的所有文档,因此您可能需要在客户端对结果进行重复数据删除。

CouchDB视图更多地是关于计算和算法,而不是任意查询和搜索的最佳视图。为此,我强烈建议您添加搜索图层,例如couchdb-luceneelasticsearch