Couchdb 从文档中获取单个值
CouchDB中是否有可能从文档中检索单个值?例如,我有一个包含10000个键的文档,如下所示:Couchdb 从文档中获取单个值,couchdb,Couchdb,CouchDB中是否有可能从文档中检索单个值?例如,我有一个包含10000个键的文档,如下所示: { "_id": "8098091cc795acde43cd45335373cc92", "_rev": "2-6d2e0ac43618388cc958b91e5015bba5", "1":"some value", "2":"another value", ... "10000":"last value" } function(doc, req) { //
{
"_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文档并仅为一条记录减少它对于服务器来说不昂贵吗?