Я думаю, что я могу попробовать что-то невозможное - сложный сценарий Couchdb "JOIN" - PullRequest
2 голосов
/ 10 февраля 2011

Я думаю, что то, что я пытаюсь сделать здесь, может быть невозможным, но это стоит того.

У меня есть два типа документов: Operator и Event.

В приведенном ниже примере я посылаю 3 клавиши.

[place_id, operator_id, zone_name]

operator_id и zone_name являются общими полями в обоих документах. Вот как я хочу сделать соединение между двумя типами документов.

То, что я хочу получить, это place_id как первый ключ от первого emit () и Event doc._id от второго emit ().

Таким образом, я могу указать стартовую клавишу как place_id Я хочу получить список Event._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);
   }
 }
}
}

Проблема в том, что соединение не будет работать с этим первым значением 0 во втором emit ();

Я пытался выдать ключи [operator_id, zone_name], которые позволяют объединению работать, но функция redu () принимает значение long и выдает ошибку, поскольку список Event._id s увеличивается до long.

Мне, вероятно, придется разбить это на два отдельных запроса, но я надеюсь изучить другой подход, который мне не хватает.

1 Ответ

1 голос
/ 14 февраля 2011

Все из emit() отсортировано по ключу . Зачастую ключи - это массивы для получения хорошего порядка сортировки: первый элемент имеет наивысший приоритет, затем следует второй элемент и т. Д. Однако, даже если ключ является массивом, это все равно одно, и весь вид сортируется по этому ключу .

Поэтому, чтобы объединить разные документы, они должны сортироваться рядом друг с другом в представлении. Это означает, что они должны использовать свои самые левые элементы клавиши emit().

P.S. Вероятно, бесполезно говорить о «JOIN» с CouchDB, хотя люди иногда используют это слово.

...