我对CouchDB很新,我仍然有一些问题围绕整个MapReduce查询我的数据的方式...
要继续使用传统的“博客”示例,假设我有两种类型的文档:post
和comment
...每个评论文档都有一个post_id
字段...
有没有办法只需1个查询即可获得每个帖子的评论数量的帖子列表?假设我想显示一个帖子标题列表,其中包含每个帖子的评论数量,如下所示:
My First Post: 4 comments
My Second Post: 6 comments
....
我知道我可以做到以下几点:
function(doc) {
if(doc.type == "comment") {
emit(doc.post_id, 1);
}
}
然后像这样减少它:
function (key, values, rereduce) {
return sum(values);
}
它为我提供了每个博客帖子ID的列表,以及每个帖子的评论数量。但后来我需要分别获取博客文章标题,因为我现在唯一拥有的是他们的身份......
那么,有没有一种方法可以通过只进行一次查询来检索每个博客帖子标题的列表,每个帖子的评论数量?
答案 0 :(得分:1)
答案 1 :(得分:0)
我的经验是,在大多数“正常”的情况下,你最好有一个包含帖子和评论的大文件。
当然,我知道如果你有成千上万的评论,这不是一个好主意。这就是为什么我说“大多数正常情况”。不要把这个选项立即抛弃,因为“不合适”。
你得到各种好东西,比如能够在地图视图中计算评论数,从数据库中轻松(一次请求)检索整个页面,每个帖子有ACID(带注释)等等。另外,你没有现在需要考虑像视图整理这样的技巧。
如果它变慢,你总是可以在以后转换你的数据结构(地狱,我们以前每天用RDBMS来做)。
如果您的用例并非完全不适用于此,我建议您尝试一下。它运作得非常好。
答案 2 :(得分:0)
你可以这样做:
function(doc) {
if(doc.type == "post") {
emit([doc._id, 'title', doc.title], 0);
}
if(doc.type == "comment") {
emit([doc.post_id, 'comments'], 1);
}
}
然后你会得到一个视图,其中每个帖子有两行,一行有标题,另一行有评论。
您可以在客户端上将行合并在一起,或者您可以使用“list”函数在couchdb中将这些行组合在一起:
http://wiki.apache.org/couchdb/Formatting_with_Show_and_List
function list(head, req) {
var post;
var row;
var outputRow = function() {
if(post) { send(post); }
}
while(row = getRow()) {
if(!post || row.key[0] != post.id) {
outputRow();
post = {id:row.key[0]};
}
/* If key is a triple, use part 3 as the value, otherwise assume its a count */
var value = row.key.length === 3 ? row.key[2] : row.value;
post[row.key[1]] = value;
}
outputRow();
}
注意:未经过测试的代码!