可以通过 CouchDB 的 1 个查询来获得两者。两个查询都使用 map/reduce 查询,尽管您不需要 reduce 函数。
您需要视图行具有 [$type, $topic, $timestamp] 键对:
["article" , "money", "2011-09-21T20:50:29.819Z"]
["article" , "shoes", "2011-09-21T20:30:29.819Z"]
["article" , "shoes", "2011-09-21T20:50:29.819Z"]
["question", "grits", "2011-01-13T20:30:18.123Z"]
["question", "money", "2011-09-20T20:30:18.123Z"]
这个函数可能会这样做:
function(doc) {
// _design/my_app/_view/topic_parts
var key;
if(doc.type && doc.parent_topic && doc.created_at) {
// Looks good, emit it into the view.
key = [doc.type, doc.parent_topic, doc.created_at];
emit(key, doc);
}
}
要查找最新的 N 行(无论是文章还是问题),您基本上需要按降序匹配 [$type, $topic, *] 的行。例如,对于主题 X 的最新 N 篇文章,就可以这样分解。 (注意null是CouchDB中的最小值,对象{}是最大的。)
-
descending=true 获取反向时间顺序。 (注意“降序”在概念上意味着沙发从“底部”扫描到“顶部”行。所以 startkey 和 endkey 是相反的。)
-
startkey=["articles","X",{}],所以这是关于X的文章,从时间的尽头开始
-
endkey=["articles","X",null],这是相同的文章关于X以时间的开始结尾
-
limit=N,将结果缩减
查询因此看起来像这样(如果需要,请记住对 URL 进行编码)。
GET /db/_design/my_app/_view/topic_parts?descending=true&startkey=["articles","X",{}]&endkey=["articles","X",null]&limit=N