CouchDB просмотр запроса с несколькими ключевыми значениями

#couchdb

#couchdb

Вопрос:

В настоящее время я пытаюсь создать представление и запрос, соответствующие этому SQL-запросу:

 SELECT * FROM articles
WHERE articles.location="NY" OR articles.location="CA"
ORDER BY articles.release_date DESC
  

Я попытался создать представление со сложным ключом:

 function(doc) { 
  if(doc.type == "Article") { 
    emit([doc.location, doc.release_date], doc) 
  }
}
  

А затем использует startkey и endkey для извлечения одного местоположения и упорядочивает результат по дате выпуска.

 .../_view/articles?startkey=["NY", {}]amp;endkey=["NY"]amp;limit=5amp;descending=true
  

Это работает нормально.

Однако, как я могу отправить несколько начальных и конечных клавиш в свое представление, чтобы имитировать

WHERE articles.location="NY" OR articles.location="CA" ?

Комментарии:

1. Хотя ответы правильные, похоже, что это все еще невозможно, похоже, что это будет доступно всякий раз, когда выйдет версия 2.0: issues.apache.org/jira/browse/COUCHDB-523

Ответ №1:

Мой заклятый враг, Доминик, прав.

Кроме того, в CouchDB никогда невозможно выполнить запрос по критерию A, а затем отсортировать по критерию B. В обмен на это неудобство CouchDB гарантирует масштабируемое, надежное, логарифмическое время выполнения запроса. У вас есть выбор.

  • Сохраните выходные данные представления в собственной базе данных и создайте новое представление для сортировки по критерию B
  • или отсортируйте строки позже, что может быть либо
    • Сортируйте на стороне клиента, как только вы получите строки
    • Сортировка на стороне сервера с помощью _list функции. Это здорово, но помните, что в конечном итоге это не масштабируемо. Если у вас миллионы строк, _list функция, вероятно, завершится сбоем.

Комментарии:

1. Я планирую иметь не менее 50 000 документов, поэтому о сортировке на стороне клиента не может быть и речи 🙂 Функции _list и _clist не будут масштабироваться… итак, осталось только 2 варианта: сохранить выходные данные представления в собственной базе данных и создать новое представление или использовать поисковую систему Lucene? Как бы это решить? Допустим, у меня есть 50 местоположений, я не хочу выполнять 50 вызовов моего представления, а затем перебирать результаты, чтобы получить 10 самых последних статей.

2. @ephemere, временная база данных не идеальна, я знаю. Однако, получив его, вы можете использовать его для любой подобной ситуации, выбирать по A, сортировать по B. Вы просто будете извлекать _view строки и превращать их в _bulk_docs rows.

3. @ephemere, не могли бы вы уточнить варианты использования? Поиск 10 самых последних статей по всем местоположениям может быть решен с помощью другого представления. Кроме того, если вы ищете ограниченное количество документов (скажем, 10 самых последних статей) по произвольному выбору местоположений (возможно, по запросу пользователя), вы всегда можете выполнить один поиск по местоположению, но ограничить возвращаемый результат от каждого из них. Выборка 10 документов из каждого местоположения = 30 документам.

Ответ №2:

Короткий ответ заключается в том, что в настоящее время вы не можете использовать несколько комбинаций клавиш startkey / endkey.

Вам либо придется выполнить 2 отдельных запроса, либо вы всегда можете добавить поисковую систему lucene, чтобы получить гораздо более надежные возможности поиска.

В запросе можно использовать несколько key параметров. Смотрите документацию Couchbase CouchDB по многодокументной выборке.

Комментарии:

1. 1. Я взял на себя смелость ссылаться на документы о нескольких key запросах одновременно (своего рода, но не совсем запрос OR).

2. Проблема с этим решением заключается в том, что я не хочу указывать дату. Допустим, мне нужны 10 самых последних статей для Нью-Йорка или Калифорнии, как я мог бы написать это, используя keys? { «ключи»: [[«Нью-Йорк», {}], [«КАЛИФОРНИЯ», {}]]}

3. страница для выборки из нескольких документов равна 404. Вам может понадобиться это: couchbase.com/docs/couchbase-single-server-1-2 /…

4. Мертвая ссылка в ответе, и ссылка @Cheeso также мертва.