我定义了以下视图:
{ "_id":"_design/test",
"language":"javascript",
"views":
{ "test":
{ "map": "function(doc) { for (var k in doc.data) emit(doc.data[k],null);}",
"options": {"collation":"raw"}
}
}
}
在没有任何参数的情况下查询视图时,我得到了预期的结果(排序为“AB ... ab”而不是“aAbB”,因为我指定了原始排序规则):
http://localhost:5985/test/_design/test/_view/test
{"total_rows":13,"offset":0,"rows":[
{"id":"-","key":"A","value":null},
{"id":"-","key":"B","value":null},
{"id":"-","key":"C","value":null},
{"id":"-","key":"D","value":null},
{"id":"-","key":"E","value":null},
{"id":"-","key":"F","value":null},
{"id":"-","key":"a","value":null},
{"id":"-","key":"b","value":null},
{"id":"-","key":"c","value":null},
{"id":"-","key":"d","value":null},
{"id":"-","key":"e","value":null},
{"id":"-","key":"f","value":null},
{"id":"-","key":"g","value":null}
]}
然后我使用startkey
和endkey
来询问B
和a
之间的范围,我希望收到密钥BCDEFa
,而是我收到以下错误消息:
http://localhost:5985/test/_design/test/_view/test?startkey=%22B%22&endkey=%22a%22
{ "error": "query_parse_error",
"reason": "No rows can match your key range, reverse your start_key and
end_key or set descending=true"
}
当行B,C,D,E,F和a匹配时,为什么没有行可以匹配键范围?
编辑:我有一个文件(版本和ID省略):
{ "_id": "-",
"_rev": "-",
"data": [ "A", "B", "C", "D", "E", "F", "a", "b", "c", "d", "e", "f", "g" ]
}
答案 0 :(得分:2)
我可以确认我在Ubuntu 10.04上的版本1.1中遇到了相同的行为。
详细说明:
curl http://localhost:5984/test/_design/test/_view/view?startkey=%22B%22\&endkey=%22a%22
返回错误
{"error":"query_parse_error","reason":"No rows can match your key range, reverse your start_key and end_key or set descending=true"}
而
curl http://localhost:5984/test/_design/test/_view/view?startkey=%22B%22\&endkey=%22D%22
给出
{"total_rows":12,"offset":1,"rows":[
{ “ID”: “东西”, “关键”: “B”, “值”:空} { “ID”: “东西”, “关键”: “C”, “价值”:空}, { “ID”: “东西”, “关键”: “d”, “价值”:空} ]}
所以引用问题看起来不是问题。
我使用的是单个文件:
{
“_ id”:“东西”, “_rev”:“2-0507028fcab427a1b28ed6b3d4a6c05e”, “数据”:[ “一个”, “B”, “C”, “d”, “E”, “F”, “一个”, “B” “C”, “d”, “E”, “F” ] }
答案 1 :(得分:2)
我在http://guide.couchdb.org/draft/views.html上找到了这个提示(段落反转结果)。 希望能帮到你。
反转结果
要以相反顺序检索视图结果,请使用descending=true
查询参数。如果您使用的是startkey
参数,您会发现CouchDB会返回不同的行或根本不返回任何行。怎么了?
当你看到视图查询选项如何工作时,这很容易理解。视图存储在树结构中以便快速查找。无论何时查询视图,这都是CouchDB的运行方式:
startkey
指定的位置开始阅读,如果有的话。
endkey
(如果有)。
如果指定descending=true
,则读取方向相反,不视图中行的排序顺序。此外,遵循相同的两步程序。
假设您有一个如下所示的查看结果:
核心价值
0
"foo"
1
"bar"
2
"baz"
以下是潜在的查询选项:?startkey=1&descending=true
。 CouchDB将做什么?请参阅上面的#1:它跳转到startkey
,这是带有键1
的行,并开始向后阅读,直到它到达视图的末尾。所以特定的结果是:
核心价值
1
"bar"
0
"foo"
这很可能不是你想要的。要以相反的顺序获取索引为1
和2
的行,您需要将startkey
切换为endkey
:endkey=1&descending=true
:
核心价值
2
"baz"
1
"bar"
现在看起来好多了。 CouchDB开始在视图底部读取并向后移动直到它达到endkey
。
答案 2 :(得分:0)
在再次查看大量文档并四处询问之后,似乎这种行为是无意的。我有submitted a JIRA bug这个。我目前没有通用的解决方法可以提出建议,但我已经能够在我的具体情况下解决这个问题。