是否可以使用CouchDB视图进行多路连接?
问题描述:
正如许多地方所提到的,在MapReduce中以'sql-esque'方式加入数据是可能的,例如these Standford course notes和this MSc thesis以及http://ijniet.org:p。发布的plagiarized copy of that thesis。是否可以使用CouchDB视图进行多路连接?
我有3个实体:
A
B
C
A
和B
可以ab
柱接合,并且可以BC
上bc
柱接合。我认为,我可以通过级联MapReduce任务来实现这一点。但是,我无法以任何方式在CouchDB中执行此操作,无论是使用Map函数,减少函数,列表函数(消耗MapReduce视图)还是这些操作的组合...
在CouchDB中,您可以使用相同的连接键输出不同实体的文档。但据我所知,没有可能的映射函数允许通过相同的键或键范围对多个实体进行分组?
这是专门针对JOINS的,其中每个连接的外键列是不同的。
答
您不能在CouchDB中进行级联连接。
您可以做的唯一连接是一对多连接。
它由发射链接文档作为一种价值的视图:
function(doc){
emit([doc._id,0]);
emit([doc.ab,1],{_id:doc.ab});
}
然后你用?include_docs=true
查询,你会得到这样的事情:
{rows:[
{key:["my_main_doc_id",0],doc:{my main document...}},
{key:["my_main_doc_id",1],doc:{child doc...}}
]}
看到这个documentation
这看起来像你正在创建文档本身的实体关系。您还可以通过使用相同的密钥发出不同实体类型的文档来近似连接,然后检索分组映射索引。但是我意识到你不能在reduce函数中进行实际的连接,因为你需要允许rereduce = true –