2012-06-04 5 views
1

Я ищу общее решение проблемы с просмотрами couchdb.CouchDB View with 2 Keys

Например, есть результат просмотра, как это:

{"total_rows":4,"offset":0,"rows":[ 
{"id":"1","key":["imported","1"],"value":null}, 
{"id":"2","key":["imported","2"],"value":null}, 
{"id":"3","key":["imported","3"],"value":null}, 
{"id":"4","key":["mapped","4"],"value":null}, 
{"id":"5,"key":["mapped","5"],"value":null} 
] 

1) Если я хочу, чтобы выбрать только "импортированные" документы я хотел бы использовать это:

view?startkey=["imported"]&endkey=["imported",{}] 

2) Если я хочу для выбора всех импортированных документов с более высоким идентификатором, а затем 2:

view?startkey=["imported",2]&endkey=["imported",{}] 

3) Если я хочу выбрать все импортированные документы с помощью id между 2 и 4:

view?startkey=["imported",2]&endkey=["imported",4] 

My Questtion: Как я могу выбрать все строки с идентификатором от 2 до 4?

+1

По какой-либо причине у вас не может быть отдельного представления, которое испускает только 2-й параметр? –

+1

Единственная причина в том, что у меня много дел с той же проблемой, и я хочу избежать «дублирования» всех этих представлений ... Мне нужно это для прокрутки функций. – bernhardh

ответ

2

Некоторое время назад я столкнулся с той же проблемой, поэтому объясню свое решение. Внутри любой функции карты вы можете иметь несколько вызовов emit(). Функция карты в вашем случае может выглядеть следующим образом:

function(doc) { 
    emit([doc.number, doc.category], null); 
    emit([doc.category, doc.number], null); 
} 

Вы также можете использовать ?include_docs=true получить документы обратно с любого из ваших запросов. Тогда ваш запрос, чтобы получить обратно строки 2 до 4 будет

view?startkey=[2]&endkey=[4,{}] 

Вы можете просмотреть правила сортировки по CouchDB View Collation

+0

Спасибо за ваш ответ! Но это решение еще хуже, чем два представления, потому что в этом решении вы не знаете, является ли результирующая строка элементом [число, категория] или [категория, число]. Я имею в виду, что вы не знаете, если первый ключевой элемент является категорией или числом (если, например, оба являются строками). – bernhardh

+0

@leftjustified: Есть ли причина, что число в ключе должно быть строкой? – tsliwkan

+1

номер/категория - это всего лишь один пример, вы также можете назвать его groupName и categoryName или что-то другое ... или город и категория. – bernhardh

2

Вы можете попытаться продолжить решение выше, но PREPEND ключи с видом «испускать индекс»флаг, как это:

map: function (doc) { 
    emit ([0, doc.number, doc.category]); // direct order 
    emit ([1, doc.category, doc.number]); // reverse order 
} 

так что вы сможете запросить их

view?startkey=[0, 2]&endkey=[0, 4, {}] 

или

view?startkey=[1, 'imported', 2]&endkey=[1, 'imported', 4] 

Но 2 разные точки зрения будет лучше в любом случае.

+0

Хорошо, я думаю, что нет другого решения, кроме создания двух отдельных видов – bernhardh