【问题标题】:Can you implement document joins using CouchDB 2.0 'Mango'?您可以使用 CouchDB 2.0 'Mango' 实现文档连接吗?
【发布时间】:2017-02-13 14:25:23
【问题描述】:

根据之前关于 CouchDB 1.6.1 的工作,我知道可以通过以下几种方式实现文档连接:

例如,使用简单架构 'studentsand 'courses:

// Students table
| Student ID | Student Name
| XYZ1       | Zach

// Courses table
| Course ID  | Student ID
| COURSE1    | XYZ1

这个 SQL 查询:

SELECT [Student Name], [Course ID] FROM Students RIGHT OUTER JOIN Courses ON Students.[Student ID] = Courses.[Student ID]

可以在 CouchDB 1.6 中使用地图功能实现:

// Map function
function(doc){
    if (doc.type == 'Course') emit(doc["Student ID"], doc);
    if (doc.type == 'Student') emit(doc["Student ID"], doc)
}

还有一个 group 和 reduce 函数

// Group would produce:
Student ID: [{course doc}, {student doc}, {course doc}, etc]

// Reduce would allow you to then process student and course docs for a single ID (with CouchDB protesting about expanding view indexes)

或者您可以使用 List 函数来遍历分组或未分组的 Map 索引。

查看 Mango here 的文档,提到 _find(我假设它是“Mango 端点”)使用索引。我不知道如何说'一个字段等于另一个字段',但是我对Mango一点也不熟悉......

问题:

  1. 你能在 Mango 中“模拟”文档连接吗?
  2. 如果可以,这会比使用 MapReduce 做同样的事情更好还是更差?

【问题讨论】:

    标签: join mapreduce couchdb couchdb-2.0 couchdb-mango


    【解决方案1】:

    我想你已经明白了,但只是为了记录:你可以使用相等选择器,并将它们放在 OR 运算符中。

    查询应该是这样的:

    {"studentId": "SOMEID" }
    {"$or": [{"type": {"$eq": "Student"}}, {"type": {"$eq": "Course"}}]}
    

    话虽如此,您似乎尝试在 CouchBb 中处理原始关系数据。正如我常说的,你不能只是在 CouchDb 中转储关系数据并期望过上幸福的生活。在将关系数据存储到 CouchDb 之前,您可能需要考虑将其转换为丰富的域对象。

    【讨论】:

    • 在这种情况下,我的关系数据具有不一致的架构。例如,如果我有一个名为 Books 的实体,其数据来自 10 个不同的书店。所以每个书店都有书的行,但列的名称不同。我的意图是将所有“书籍”刮到沙发上,然后创建一个视图,将所有书籍行“扁平化”为一个实体。您对此有何看法?
    • 所以如果我理解正确的话,Books 实体最初并不平坦,它是一个“正常”的嵌套结构。您打算如何查询数据?您知道在查询时要检索的书籍类型吗? (基本上我需要知道你想要达到的目标,因为有不止一种方法可以做到)
    • 我意识到这可能与您的原始问题没有直接关系,您是否介意创建另一个问题并从此处链接它,以便我们有更多的空间和背景来讨论它
    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多