CouchDB 查看排序规则,一键加入,搜索其他值
Posted
技术标签:
【中文标题】CouchDB 查看排序规则,一键加入,搜索其他值【英文标题】:CouchDB view collation, join on one key, search on other values 【发布时间】:2011-06-28 02:21:34 【问题描述】:查看Couch DB Joins中描述的示例。
它讨论了视图排序以及如何为您的博客文章创建一个文档,然后每个评论在 CouchDB 中都是一个单独的文档。例如,我可以将 "My Post" 和 5 个与 "My Post" 关联的 cmets 用于总共 6 个文档。在他们的示例中,"myslug" 存储在帖子文档和每个评论文档中,因此当我使用键 "myslug" 搜索 CouchDB 时,它会返回所有文件。
这是问题/问题。假设我想搜索 cmets 中的作者和一个也有 "news" 类别的帖子。这将如何运作?
例如:
function(doc)
if (doc.type == "post")
emit([doc._id, 0], doc);
else if (doc.type == "comment")
emit([doc.post, 1], doc);
这将基于此加载我的博客文章和 cmets:?startkey=["myslug"]
但是,我想这样做,获取作者 bob 的 cmets,以及类别为 news 的帖子。对于此示例,bob 已将三个 cmets 写入博客文章,类别为 news。似乎 CouchDB 只允许我搜索两个文档中都存在的键,而不是搜索一个文档中的键,以及与 map 函数一起 “join” 的另一个文档中的键。
换句话说,如果 post 和 cmets 通过 slug 连接,我如何搜索一个文档中的一个字段和另一个文档中的另一个字段,这些字段由 id aka 连接。蛞蝓?
在 SQL 中应该是这样的:
SELECT * FROM comments JOIN doc.id ON doc.post WHERE author = bob AND category = news
【问题讨论】:
这是一个有趣的问题。但是我仍然不清楚你到底需要什么。是否可以解释它在 SQL 中的工作方式?然后我们可以展示 Couch 的方式! 没问题...(请原谅我的语法)... Select * from cmets join doc.id on doc.post where author = bob and category = news 。换句话说,我通过 slug/id 将 cmets 表与 posts 表连接起来......然后我从 cmets 中按作者搜索,并按帖子中的类别搜索......这样结果就会给我任何帖子类别新闻,只有作者 bob 的 cmets 我完全知道您在寻找什么。我偶然发现了这篇文章jamietalbot.com/2010/03/24/…也许这就是你需要的。 【参考方案1】:您可以通过多种方式在 CouchDB 上近似 SQL 连接。我刚刚在这里问了一个类似的问题:Why is CouchDB's reduce_limit enabled by default? (Is it better to approximate SQL JOINS in MapReduce views or List views?)
-
您可以使用 MapReduce(不是一个好的选择)
您可以使用列表(这将在发出结果之前迭代结果集,这意味着您可以以多种创造性方式“组合”文档)
您显然也可以使用“排序规则”,尽管我还没有弄清楚(似乎我总是得到计数,并且只能使用 Reduce 的功能 - 如果我走在正确的轨道上)
【讨论】:
【参考方案2】:我已经调查了 couchdb 大约一个星期,所以我几乎没有资格回答你的问题,但我想我已经得出结论,它无法完成。视图结果需要绑定到一个且只有一个文档,以便可以更新视图。您将不得不进行非规范化,至少如果您不想进行繁重的搜索。如果有人想出一个聪明的方法来做到这一点,我真的很想知道。
【讨论】:
以上是关于CouchDB 查看排序规则,一键加入,搜索其他值的主要内容,如果未能解决你的问题,请参考以下文章
CouchDB reduce函数的键(值)参数的排序顺序保证?