我想我可能在尝试一些不可能的事情——复杂的Couchdb”;加入;脚本

我想我可能在尝试一些不可能的事情——复杂的Couchdb”;加入;脚本,couchdb,mapreduce,Couchdb,Mapreduce,我想我在这里试图做的可能是不可能的,但这值得一试 我有两种文档类型,操作员和事件 在下面的示例中,我发出3个键 [地点id、操作员id、区域名称] operator\u id和zone\u name是这两个文档中的公共字段。这就是我想要在两种文档类型之间进行连接的方式 我想要得到的是place\u id作为第一个emit()的第一个键,以及第二个emit()的事件doc.\u id 这样,我就可以将startkey指定为place\u id我想获取事件的列表 function(doc) { i

我想我在这里试图做的可能是不可能的,但这值得一试

我有两种文档类型,
操作员
事件

在下面的示例中,我发出3个键

[地点id、操作员id、区域名称]

operator\u id
zone\u name
是这两个文档中的公共字段。这就是我想要在两种文档类型之间进行连接的方式

我想要得到的是
place\u id
作为第一个emit()的第一个键,以及第二个emit()的
事件
doc.\u id

这样,我就可以将startkey指定为
place\u id
我想获取
事件的列表

function(doc) {
 if(doc.doc_type == 'Operator') {
 for(var i in doc.zones) {
   for(var ii in doc.zones[i].origs) {
     if(doc.zones[i].origs[i])
       emit([doc.zones[i].origs[i], doc._id, doc.zones[i].name], null);
   }
 }
} else if (doc.doc_type == 'Event') {
 for(var i in doc.rates) {
   if(doc.rates[i].zone) {
     emit([0, doc.operator_id, doc.rates[i].zone], doc._id);
   }
 }
}
}
问题在于,第二个emit()中的第一个值为0时,联接无法工作

我已尝试发出键
[operator\u id,zone\u name]
,允许联接工作,但reduce()函数需要很长时间,并在
事件列表中引发错误。\u id
s变长

我可能不得不将其分为两个单独的查询,但希望学习我所缺少的另一种方法。

emit()
开始的所有内容都按键排序。通常,键是数组以获得良好的排序顺序:第一个元素具有最高优先级,第二个元素紧随其后,等等。但是,即使键是数组,它仍然是一件事,整个视图都是按该键排序的

因此,要在不同文档之间连接,它们必须在视图中相邻排序。这意味着他们应该共享
emit()
键最左边的元素


另外,与CouchDB谈论“JOIN”可能没有什么帮助,尽管人们有时会使用这个词。

在本例中,您发出的是一个键<代码>发射()
始终一次只输出一个键和一个值。