CouchDB 2.0+计算具有特定字段值的所有文档

时间:2018-03-17 22:39:09

标签: database performance couchdb document-database

我是CouchDB的新手,我正在寻找执行以下计数的最佳方式:

我的文件看起来像这样:

{
field_1: "some_string",
field_2: "some_other_string"
}

我想要计算field_2中具有特定值的所有文档,以便在通过{{1}查找具有该字段值的所有文档时,我知道应该设置的limit是什么使用POST /{db}/_find

我已经阅读了有关设计文档和视图以及查询协议的一些内容,但我无法理解实现此目的的正确方法。我是否需要先计算文件数量?或者有没有办法在执行查找时快速了解这一点?

1 个答案:

答案 0 :(得分:0)

  

...查找具有该字段值的所有文档时...

我认为您的目的是查找具有特定字段的所有文档。

我对/<db>/_find/<db>/_index的CouchDB mango 查询了解不多,但我认为您可以通过以下方式查找具有特定字段值的所有文档做HTTP请求。

假设您有以下文档,并且希望查找title字段等于Jacob字符串的所有文档:

{
  "_id": "doc5",
  "_rev": "1-27f5da5ca3157d4bca8b485d411e86c5",
  "unicodeString": "יעקב",
  "title": "Jacob"
}

您可以实现如下所示的视图映射功能。此视图根据B树数据结构中的title字段对数据库内的所有文档进行排序:

function (doc) {
  if(doc.title){
    emit(doc.title, [doc.unicodeString])
  }
}

让我们假设上面视图的名称是by_title,数据库的名称是sample,然后我们可以执行如下所示的HTTP请求来获取title的所有文档字段等于,例如,Jacob字符串:

$ curl -k -X GET https://joe:joe@192.168.1.106:6984/sample/_design/by_title/_view/by_title?key=\"Jacob\"
{"total_rows":15,"offset":8,"rows":[
{"id":"doc5","key":"Jacob","value":["יעקב"]},
{"id":"doc6","key":"Jacob","value":["ישראל"]}
]}

如您所见,上面带有curl的HTTP GET请求会返回title字段等于Jacob字符串的所有文档。我使用https6984端口,因为我将CouchDB与SLL和自签名证书一起使用,但您可以将其与http和端口{一起使用{1}}。

同样在上面的5984命令中,我使用带有转义双引号的密钥:curl。这样做的原因是我的Linux shell命令行在将它们传递给?key=\"Jacob\"之前会使用双引号,因此我必须将它们转义以使其正常工作。