奇怪的错误消息

时间:2011-07-01 14:58:25

标签: couchdb

我定义了以下视图:

{ "_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}
]}

然后我使用startkeyendkey来询问Ba之间的范围,我希望收到密钥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" ] 
}

3 个答案:

答案 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的运行方式:

  1. startkey指定的位置开始阅读,如果有的话。
  2. 一次返回一行,直至结束,或直到它到达endkey(如果有)。

如果指定descending=true,则读取方向相反,视图中行的排序顺序。此外,遵循相同的两步程序。

假设您有一个如下所示的查看结果:

核心价值 0 "foo" 1 "bar" 2 "baz"

以下是潜在的查询选项:?startkey=1&descending=true。 CouchDB将做什么?请参阅上面的#1:它跳转到startkey,这是带有键1的行,并开始向后阅读,直到它到达视图的末尾。所以特定的结果是:

核心价值 1 "bar" 0 "foo"

这很可能不是你想要的。要以相反的顺序获取索引为12的行,您需要将startkey切换为endkeyendkey=1&descending=true

核心价值 2 "baz" 1 "bar"

现在看起来好多了。 CouchDB开始在视图底部读取并向后移动直到它达到endkey

答案 2 :(得分:0)

在再次查看大量文档并四处询问之后,似乎这种行为是无意的。我有submitted a JIRA bug这个。我目前没有通用的解决方法可以提出建议,但我已经能够在我的具体情况下解决这个问题。