可以通过来自 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 篇文章,这样分解。(注意,这是 CouchDB 中的最小值,而对象是最大的。)null
{}
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