【发布时间】:2011-06-24 13:11:57
【问题描述】:
我认为我在这里尝试做的事情可能是不可能的,但这值得一试。
我有两种文档类型,Operator 和 Event。
在下面的示例中,我发出 3 个键。
[place_id, operator_id, zone_name]
operator_id 和 zone_name 是两个文档中的公共字段。这就是我想要在两种文档类型之间进行连接的方式。
我想要返回的是 place_id 作为第一个 emit() 的第一个键,以及第二个 emit() 的 Event doc._id。
这样,我可以将 startkey 指定为 place_id 我想取回 Event._ids 的列表。
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_id, zone_name] 以允许连接工作,但由于 Event._ids 的列表变长,reduce() 函数需要很长时间并引发错误。
我可能不得不将其分解为两个单独的查询,但希望学习一种我缺少的不同方法。
【问题讨论】:
-
在示例中,您发出 one 键。
emit()总是一次只输出一个键和一个值。