【问题标题】:I think I may be trying something impossible - complex Couchdb "JOIN" scenario我想我可能正在尝试一些不可能的事情 - 复杂的 Couchdb “JOIN”场景
【发布时间】:2011-06-24 13:11:57
【问题描述】:

我认为我在这里尝试做的事情可能是不可能的,但这值得一试。

我有两种文档类型,OperatorEvent

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

[place_id, operator_id, zone_name]

operator_idzone_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()总是一次只输出一个键和一个值。

标签: couchdb mapreduce


【解决方案1】:

emit() 中的所有内容均按排序。通常,键是数组以获得良好的排序顺序:第一个元素具有最高优先级,其次是第二个元素,依此类推。但是,即使键是一个数组,它仍然是一回事,整个视图都按该键排序.

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

附:尽管人们有时会使用这个词,但在 CouchDB 中谈论“JOIN”可能没有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 2021-04-12
    • 2019-10-22
    • 2021-10-20
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多