以下具有匹配结果集的调用返回的结果不是以文档ID a4 a6 cf 44 - 8a 82 - 494 a-a2 b 9-f6 a3 ec 629 f17开头。如以下结果集所示,前3个键相同,但startkey_docid无效。
就问几个问题
- startkey_docid能正确处理复杂的键吗?(这显然适用于couchdb)
- 如果上述问题答案为“是”,那么在我们看来,问题的来源是否是使用dateToArray(创建的文档)?
- 这是一个错误吗?
查看方式:
function (doc, meta)
{
if(meta.type == "json" && doc.type == "POST")
{
emit([doc.category, dateToArray(doc.created), doc.visibility], null);
}
}
电话:
?startkey=["auto",[2013,10,10,23,12,0],"EVERYONE"]&endkey=["auto",[2013,12,11,23,12,0],"EVERYONE"]&startkey_docid=a4a6cf44-8a82-494a-a2b9-f6a3ec629f17
结果:
{
total_rows: 20,
rows: [{
id: "a4a6cf44-8a82",
key: ["auto", [2013, 11, 8, 1, 17, 46], "EVERYONE"],
value: null
}, {
id: "a4a6cf44-8a82-494a-a2b9",
key: ["auto", [2013, 11, 8, 1, 17, 46], "EVERYONE"],
value: null
}, {
id: "a4a6cf44-8a82-494a-a2b9-f6a3ec629f17",
key: ["auto", [2013, 11, 8, 1, 17, 46], "EVERYONE"],
value: null
}, {
id: "41070cfc-a85c-424c-9b87-fce0616c77c1",
key: ["auto", [
2013, 11, 11, 20, 28, 21], "EVERYONE"],
value: null
}, {
id: "bb275e3c-54da-4e85-8cc3-21defff4e278",
key: ["auto", [
2013, 11, 13, 1, 41, 7], "EVERYONE"],
value: null
}]
}
示例数据集。post_id是文档标识。
{
type: "POST",
post_id: "a4a6cf44-8a82",
visibility: "EVERYONE",
userID: "<user_id>",
title: "Some title 1",
category: "auto",
description: "",
created: "2013-11-07 17:17:46 -0800",
modified: "2013-11-07 17:17:46 -0800"
}, {
type: "POST",
post_id: "a4a6cf44-8a82-494a-a2b9",
visibility: "EVERYONE",
userID: "<user_id>",
title: "Some title 2",
category: "auto",
description: "",
created: "2013-11-07 17:17:46 -0800",
modified: "2013-11-07 17:17:46 -0800"
}, {
type: "POST",
post_id: "a4a6cf44-8a82-494a-a2b9-f6a3ec629f17",
visibility: "EVERYONE",
userID: "<user_id>",
title: "Some title 3",
category: "auto",
description: "",
created: "2013-11-07 17:17:46 -0800",
modified: "2013-11-07 17:17:46 -0800"
}, {
type: "POST",
post_id: "41070cfc-a85c-424c-9b87-fce0616c77c1",
visibility: "EVERYONE",
userID: "<user_id>",
title: "Some title 4",
category: "auto",
description: "",
created: "2013-11-11 12:28:21 -0800",
modified: "2013-11-11 12:28:21 -0800"
}, {
type: "POST",
post_id: "bb275e3c-54da-4e85-8cc3-21defff4e278",
visibility: "EVERYONE",
userID: "<user_id>",
title: "Some title 5",
category: "auto",
description: "",
created: "2013-11-12 17:41:07 -0800",
modified: "2013-11-12 17:41:07 -0800"
}
2条答案
按热度按时间ogsagwnx1#
好吧,这是一个老线索,但为了参考起见,我将张贴我的发现,并试图解释这个功能,我可以。
示例
给定一个包含9,000多个电影文档的数据库,每个文档都包含
title
、year
、rating
、genre
等属性,为该数据库定义一个索引名为MovieIndex
的视图MovieIndexView
,该视图发出以下复杂(但相当简单)的键,用于按分级筛选电影,并按年份排序:可以使用类似于OP中所示的方法来查询具有已排序行的视图:
请注意,我们只通过设置
limit
变量提取了第一个6
文档(我只粘贴了第一个和最后一个相关项)。分页
对下一个行序列进行分页的第一步可以是直接的,只需将下一个请求的
startkey
设置为上一个集合中最后一个项的key
值,同时保持endkey
的值不变:这个新的开始键无法指定多个电影项中的哪一个具有相同的
startkey
值(具有相同评级的电影,在同一年上映)响应应该以开头。虽然请求在语法上没有错误,但您会注意到返回的行不会以我们想要的下一个顺序项开头,而是与数据库中具有key
的匹配值的另一个任意项相关联。这就是
startkey_docid
派上用场的地方:此请求将返回以序列中的正确项开头的行,从而提供了对视图中的行进行分页的最佳方法。
"外卖"
startkey_docid
必须与相关的startkey
一起使用,才能进行分页。我希望这有助于任何人谁可能是打破他们的头上这个微妙的特点。
来源
CouchDB官方文件:http://docs.couchdb.org/en/latest/couchapp/views/collation.html
有趣的线程交换:http://grokbase.com/t/couchdb/user/091defx51x/sort-by-date-and-find-by-key
类似SO主题:https://stackoverflow.com/questions/10142850/need-a-couchdb-trick-to-sort-by-date-and-filter-by-group#=
z31licg02#
您可以在此处找到有关如何正确使用
startkey_docid
的更多信息:http://blog.couchbase.com/startkeydocid-behaviour