在 couchdb 中查询地图 key/value 对

Querying on map key/value pair in couch db

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

我在 couch 数据库中有两条记录

{
   "_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"
       }
   }
}

是否可以创建一个视图并添加查询参数,以 return 所有具有标签 "key":"value" 的记录(例如,我希望所有记录都标记为 "duration":24 或者我希望所有记录都标记为 "location":"south")。我不想将任何 key/values 硬编码到视图中 - 它们应该与查询一起传递。

是否有另一种不是视图的思考方式?

实现此目的的一种方法是使用 [ 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-lucene or elasticsearch.