CouchDB视图排序规则,连接一个键,搜索其他值

时间:2011-02-16 04:01:18

标签: couchdb key join collation

查看Couch DB Joins中描述的示例。

它讨论了视图整理以及如何为博文发布一个文档,然后每个评论都是CouchDB中的单独文档。例如,我可以将“我的帖子”和5条评论与“我的帖子”相关联,共计6个文档。在他们的示例中,“myslug”存储在post文档和每个注释文档中,这样当我使用键“myslug”搜索CouchDB时,它将返回所有文档。

这是问题/问题。假设我想在评论中搜索作者,还有一个帖子也有“news”的类别。这怎么会正常工作?

例如:

function(doc) {
  if (doc.type == "post") {
    emit([doc._id, 0], doc);
  } else if (doc.type == "comment") {
    emit([doc.post, 1], doc);
  }
}

这将基于此加载我的博文和评论:?startkey=["myslug"]

但是,我想这样做,抓住作者 bob 的评论,以及具有 news 类别的帖子。对于此示例, bob 已向博客文章写了三条评论,其中包含 news 类别。似乎CouchDB只允许我搜索两个文档中存在的键,而不是搜索一个文档中的键,而另一个键中的键与map函数一起“join”

换句话说,如果帖子和评论由slug连接,我如何搜索一个文档中的一个字段和另一个由id又加入的文档中的另一个字段。团状?

在SQL中它将是这样的:

SELECT * FROM comments JOIN doc.id ON doc.post WHERE author = bob AND category = news

2 个答案:

答案 0 :(得分:0)

我一直在调查couchdb大约一个星期,所以我没有资格回答你的问题,但我想我已经得出结论,它无法完成。查看结果需要绑定到一个且只有一个文档,以便可以更新视图。你将不得不进行非规范化,至少如果你不想进行咕噜声搜索。如果有人想出一个聪明的方法,我真的很想知道。

答案 1 :(得分:0)

有几种方法可以在CouchDB上近似SQL连接。我刚刚在这里问了一个类似的问题:Why is CouchDB's reduce_limit enabled by default? (Is it better to approximate SQL JOINS in MapReduce views or List views?)

  1. 您可以使用MapReduce(不是一个好的选项)
  2. 您可以使用列表(这将在发布结果之前迭代结果集,这意味着您可以通过多种创造性方式“合并”文档)
  3. 你也可以显然使用'整理',虽然我还没有想到这一点(似乎我总是得到一个计数,只能使用Reduce的功能 - 如果我在正确的轨道上)