【发布时间】:2012-02-24 09:15:59
【问题描述】:
我使用一个 DB 存储纯文档,另一个 DB 仅存储附件,但我将附件 ID 存储在纯文档 DB 中。有什么方法可以像 RDBMS 这样对两个数据库执行连接操作。
【问题讨论】:
标签: javascript couchdb
我使用一个 DB 存储纯文档,另一个 DB 仅存储附件,但我将附件 ID 存储在纯文档 DB 中。有什么方法可以像 RDBMS 这样对两个数据库执行连接操作。
【问题讨论】:
标签: javascript couchdb
我知道可以在数据库中进行连接:
这是一篇很棒的帖子:http://www.cmlenz.net/archives/2007/10/couchdb-joins
关键在于 couchdb 可以对 json 值进行排序,包括列表。
所以让我们从头开始...如您所知,CouchDB 存储 JSON 文档。它使用映射函数来“发出”有序的键值对(这里是 couchdb 权威指南中的页面:http://guide.couchdb.org/draft/views.html)所以让我们举一个超级简单的例子,然后是我们需要的“连接”复杂的例子。
这是一个映射函数,它遍历数据库中的每个文档,检查文档是否有作者,如果有,则显示它的作者和帖子。结果将是按键排序的“键值对”列表,在本例中为作者(并且它按字母顺序排列)。
function (doc) {
if (doc.author) {
emit(doc.author, doc.post);
}
}
现在是我们的复杂示例。此示例假设 db 有博客文章作为 json 文档,而 cmets 作为单独的 json 文档。 cmets 有一个名为“post”的键,其中包含它们所属的博客文章的 id,很像 mySQL 中的外来 id。
function(doc) {
if (doc.type == "post") {
emit([doc._id, 0], doc);
} else if (doc.type == "comment") {
emit([doc.post, 1], doc);
}
}
那么到底发生了什么?因此,首先要注意的是“其他”部分。这个函数实际上将博客文章和 cmets 映射到同一个视图(键值对的有序列表)。
'doc._id' 是特定帖子的 id,'doc.post' 是评论所属的两个帖子的 id。所以整个列表是按照博文的 id 排序的。
如果 doc.type 是“博客文章”,它会在数组中附加一个“0”来表示,而“1”则表示属于“cmets”的文档。现在这里是魔法。文档(帖子和 cmets)在一个键值对列表中排序,但是因为 CouchDB 可以对数组进行排序,所以它会在一篇博文和下一篇博文之间滑动带有“1”(cmets)的那些。有意义吗?
哈哈,与我们习惯的不同,这只是一种创造性的解决方案。还有许多其他方法可以创建您可能需要的结果。希望这有帮助!
【讨论】:
没有办法加入,但是您可以考虑将附件存储在同一个数据库中,或者在引用它们的同一个文档中。
【讨论】: