我使用一个DB存储普通文档,另一个DB用于存储附件。但我将附件ID存储在普通文档DB中。有没有办法如何执行连接操作两个数据库,如RDBMS。
先谢谢
答案 0 :(得分:2)
我知道可以在数据库中进行连接:
以下是一篇很棒的帖子:http://www.cmlenz.net/archives/2007/10/couchdb-joins
它的关键是couchdb可以命令json值,包括列表。
所以让我们从顶部开始......正如您所知,CouchDB存储JSON文档。它使用map函数来“发出”有序键值对(这里是来自couchdb权威指南的页面:http://guide.couchdb.org/draft/views.html)所以让我们看一个非常简单的例子,然后是'join'所需的复杂函数。
这是一个映射函数,它遍历数据库中的每个文档,检查文档是否有作者,如果有,则显示它的作者及其帖子。结果将是按键排序的“键值对”列表,在本例中为作者(按字母顺序排列)。
function (doc) {
if (doc.author) {
emit(doc.author, doc.post);
}
}
现在我们的复杂例子。此示例假定数据库的博客文章为json docs,注释为单独的json文档。这些评论有一个名为'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);
}
}
那到底是怎么回事?所以,首先要注意的是“其他”部分。此函数实际上将博客帖子和评论映射到同一视图(键值对的有序列表)。
'doc._id'是特定帖子的ID,'doc.post'是评论所属的帖子的ID。所以整个列表都是由博客文章的ID订购的。
如果doc.type是一个'博客文章',它会在数组中附加一个'0'来表示,并且对于'评论'的文档,它会加一个'1'。现在这里是魔术。文档(帖子和评论)在一个键值对列表中排序,但由于CouchDB可以对数组进行排序,因此它会在一个博客帖子和下一个博客文章之间滑动那些带有“1”(评论)的文章。有意义吗?
哈哈,与我们习惯的不同,这只是一个创造性的解决方案。还有许多其他方法可以创建您可能需要的结果。希望这有用!答案 1 :(得分:0)
无法加入,但是您可以考虑将附件存储在同一个数据库中,或者在引用它们的相同文档中。