Couchdb 从文档中获取单个值

Couchdb 从文档中获取单个值,couchdb,Couchdb,CouchDB中是否有可能从文档中检索单个值?例如,我有一个包含10000个键的文档,如下所示: { "_id": "8098091cc795acde43cd45335373cc92", "_rev": "2-6d2e0ac43618388cc958b91e5015bba5", "1":"some value", "2":"another value", ... "10000":"last value" } function(doc, req) { //

CouchDB中是否有可能从文档中检索单个值?例如,我有一个包含10000个键的文档,如下所示:

{
   "_id": "8098091cc795acde43cd45335373cc92",
   "_rev": "2-6d2e0ac43618388cc958b91e5015bba5",
   "1":"some value",
   "2":"another value",
   ...
   "10000":"last value"
}
function(doc, req) {
  // _show function to extract one field

  var field_name = req.query.name; // Set to e.g. "some_field"
  var field_value = doc[field_name];

  return { "code": 200   // HTTP status code
         , "headers":    // Response headers
           { "content-type": "text/plain" }
         , body: field_value
         };
}
{ "_id": "_design/example"
, "shows":
  { "one_field": ... } // Paste the above function as a string.
}
我不想每次都解析整个文档,只想得到key“2”的值。这可能吗

编辑:


当然,在问这个问题之前,我查阅了文档并在谷歌上搜索了一下,但没有发现这种可能性。但我想知道为什么这是不可能的?据我所知,视图和文档之间并没有太大区别,因为它们都是键值对的集合,但可以使用查询字符串中的
?key=…
从视图中获取单个值,而不可能对文档执行相同的操作。为什么?

否。CouchDB是一个面向文档的数据库,因此除了整个文档本身之外,它不支持更细粒度的数据访问

它为您提供细粒度索引,但不提供实际访问。

您可以使用在服务器上处理文档并向客户端发送任意数据。Show函数可以做一些简单的事情,比如从文档中提取单个值;或者,它们可以转换为完全不同的内容类型,如XML

例如:

  • 在数据库中
    db
  • 其中包含设计文档
    \u设计/示例
    ,具有显示功能
    一个字段
  • 您想获取ID为
    doc\u ID
  • 但是只检索字段
    somefield
    ,该字段的值为
    “我是somefield值!”
该问题将是:

GET /db/_design/example/_show/one_field/doc_id?name=some_field
show函数将如下所示:

{
   "_id": "8098091cc795acde43cd45335373cc92",
   "_rev": "2-6d2e0ac43618388cc958b91e5015bba5",
   "1":"some value",
   "2":"another value",
   ...
   "10000":"last value"
}
function(doc, req) {
  // _show function to extract one field

  var field_name = req.query.name; // Set to e.g. "some_field"
  var field_value = doc[field_name];

  return { "code": 200   // HTTP status code
         , "headers":    // Response headers
           { "content-type": "text/plain" }
         , body: field_value
         };
}
{ "_id": "_design/example"
, "shows":
  { "one_field": ... } // Paste the above function as a string.
}
设计文档如下所示:

{
   "_id": "8098091cc795acde43cd45335373cc92",
   "_rev": "2-6d2e0ac43618388cc958b91e5015bba5",
   "1":"some value",
   "2":"another value",
   ...
   "10000":"last value"
}
function(doc, req) {
  // _show function to extract one field

  var field_name = req.query.name; // Set to e.g. "some_field"
  var field_value = doc[field_name];

  return { "code": 200   // HTTP status code
         , "headers":    // Response headers
           { "content-type": "text/plain" }
         , body: field_value
         };
}
{ "_id": "_design/example"
, "shows":
  { "one_field": ... } // Paste the above function as a string.
}
CouchDB会回来的

HTTP 200 OK
Content-Type: text/plain
Content-Length: 26

I am the some_field value!

好啊它是面向文档的。。。但为什么可以从视图中通过键获取值,而不可能从文档中获取值呢?他们之间有太大的区别吗?据我所知,它们都是关键价值存储库。@Will基本上是正确的。关于
\u show
函数,我的答案是CouchDB的HTTP API语法糖。
\u show
函数执行与客户端相同的操作:获取整个文档并丢弃大部分文档。事实上,它们必须是纯函数,才能对给定文档具有确定性。另一方面,它确实感觉像是一个单值查询<代码>\u更新功能更出色!非常感谢。这正是我所需要的,甚至更多。@Vader,不客气。我编辑了答案以更正URL中的一个小错误(忘记在路径中包含文档ID)。是否可以对变量使用相同的技术只获取一条记录?@stackdave我认为答案是肯定的。对我来说,“记录”就是CouchDB所称的“文档”。在我看来,使用CouchDB的最佳方式是尽量少使用show和list函数。只需获取文档或视图行等,并使用自己的程序处理它们。(虽然这些函数在某些情况下很有用,比如减少线路上的数据。)我不清楚/one_字段/它是如何工作的,在列表上还是在函数中,没有nano的情况下,通过id直接访问url不是更简单的工作吗?获取所有de文档并仅为一条记录减少它对于服务器来说不昂贵吗?