2011-10-26 60 views
0

CouchDB文档似乎有一个附加密钥;检索一个文档时,它不会显示出来,但是你可以用它们来检索文件的范围,如:明确设置CouchDB文档密钥

wget "http://localhost:5984/monitor20n/_all_docs?startkey=1111&endkey=2222 

然而,显然这关键是始终一样的文档ID,让你获得的像这样的东西

{"total_rows":14269,"offset":0,"rows":[ 
{"id":"128127896626798592","key":"128127896626798592","value":{"rev":"1-4e07e2c4b4eddfad5846ddf905337197"}}, 
{"id":"128128575021907970","key":"128128575021907970","value":{"rev":"1-43d983af1e837a4415b6167cae3b5de8"}}, 
... and so on }} 

(请参阅key == id)。但是,您可以在视图中使用更复杂的键,包括允许更复杂的交互的向量;至少,您可以设置视图的关键点,以便现在可以提前查找要查找的文档ID。 现在的问题是:您可以在创建文档时设置这些键吗?或者可能在创建它之后? 一个显而易见的解决办法然而,创建这样

function (doc) { 
    emit(doc.key,doc) 
} 

一个观点,我想知道是否有获得相同的效果更直接的方式。

回答

4

键是CouchDB视图的重要组成部分。有鉴于此,关键不一定是文档ID。但产生密钥的唯一方法是在视图内使用emit函数。没有可以设置的属性会自动成为关键。

将_all_docs想像为内置视图。为了保持一致,它的输出与常规视图相同,并使用id作为键。但是你不能改变_all_docs视图。如果您希望在保存文档时提供自己的_id,那最终将成为关键。 因此,如果您想在'_all_docs'视图中定制'按键',您可以创建如下文档:

{_id:'Sample1'},{_id:'My2'}。并在保存之后,当您请求'_all_docs'视图时,您将得到: {“total_rows”:2,“offset”:0,“rows”:{“id”:“Sample1”,“key” :“Sample1”,“value”:{“rev”:“1-4e07e2c4b4eddfad5846ddf905337197”}}, {“id”:“My2”,“key”:“My2”,“value”:{“rev”:“ 1-43d983af1e837a4415b6167cae3b5de8" }}, ...等}}

这是一个关于是什么导致documentID链接:

http://wiki.apache.org/couchdb/HTTP_Document_API#Special_Fields

虽然它没有明确说,你不能使用对象或数组作为DocumentID。

希望有所帮助。

+0

所以我想另一个解决方法是使用围绕你想要使用的实际密钥的启发式规则来生成id。例如,如果您想按日期范围进行搜索,整理日期,对吧? – jjmerelo

+0

你可能想要开始一个更具体的问题,你想要做什么。这是一个很好的例子:http://stackoverflow.com/questions/3079040/range-keys-in-couchdb-views –