【问题标题】:Couch DB Join operations like RDBMSCouch DB Join 操作,如 RDBMS
【发布时间】:2012-02-24 09:15:59
【问题描述】:

我使用一个 DB 存储纯文档,另一个 DB 仅存储附件,但我将附件 ID 存储在纯文档 DB 中。有什么方法可以像 RDBMS 这样对两个数据库执行连接操作。

【问题讨论】:

    标签: javascript couchdb


    【解决方案1】:

    我知道可以在数据库中进行连接:

    这是一篇很棒的帖子: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)的那些。有意义吗?

    哈哈,与我们习惯的不同,这只是一种创造性的解决方案。还有许多其他方法可以创建您可能需要的结果。希望这有帮助!

    【讨论】:

      【解决方案2】:

      没有办法加入,但是您可以考虑将附件存储在同一个数据库中,或者在引用它们的同一个文档中。

      【讨论】:

      • 引用它们的相同文档。
      猜你喜欢
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 2015-02-23
      相关资源
      最近更新 更多