你能用CouchDB 2.0'Mango'实现文档连接吗?

时间:2017-02-13 14:25:23

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

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

例如,使用“student and '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 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端点')使用索引。我没有看到说'的方式,其中一个字段等于另一个字段',但后来我对芒果根本不是很熟悉......

问题:

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

1 个答案:

答案 0 :(得分:1)

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

查询应该是这样的:

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

话虽如此,您似乎尝试使用CouchBb中的原始关系数据。正如我经常说的那样,你不能仅仅在CouchDb中转储关系数据并希望过上幸福的生活。您可能需要考虑将关系数据转换为富域域对象,然后再将其存储在CouchDb中。