2013-03-07 3 views
8

Как получить данные из CouchDB, фильтруя несколько полей.Поиск по нескольким критериям с CouchDB

Например, если у меня есть база данных человека с полями, такими как Name, State, Country и т. Д .; и форму поиска на веб-странице. Как получить данные из CouchDB, учитывая только ненулевые условия.

в SQL, я бы добавить условия, где положение WHERE Person.Name="John" AND Person.State in ("NY","CA"), но Как определить этот запрос как CouchDB Посмотреть

ответ

7

В CouchDB вы используете карту/уменьшить просмотров. В SQL вы должны явно указать, для какого поля будет создан индекс. В CouchDB вы создаете индекс создания специальных функций, поэтому он может быть более конкретным для ваших нужд. Если вы хотите, чтобы индекс для такой простой вещи, как поиск с именем, государством и страной полого вида просто карта функция:

function (doc) { 
    if (doc.name && doc.state && doc.country) 
    emit([doc.name, doc.state, doc.country], doc); 
} 

Для поиска с использованием этой точки зрения вы поиск по ключевому ["my_name", "my_state", "my_country"]. Вы можете использовать его для запросов с подмножеством имени, состояния и страны, если они являются префиксом испускаемого массива (например, поиск с name, но не с state и country), потому что результат поиска, сопоставляемый с результатами поиска, сортируется лексикографически.

В принципе, представление представляет собой индекс с некоторыми возможностями запросов, но не такими гибкими, как SQL-запросы. Они выполняются один раз и сохраняются на диске и инкрементно вычисляются для новых/измененных данных. Имейте в виду, что трудно делать вещи, которые неэффективны в распределенной системе (для которых разработан CouchDB): более сложные объединения, поиск без индекса ... Хотя во многих случаях искусственное разделение для таблиц в реляционной модели необязательно при структурировании документы доступны, и некоторые из них не нужны.

Для получения более подробной информации о ценах на CouchDB по сравнению с SQL, см. this chapter of The Definitive Guide и других главах и официальной информации wiki.

+0

Я думаю, что реальный вопрос здесь, что делать, когда у вас есть высокие й количество полей, и вы не знаете, какая комбинацию критериев поиска вашего пользователя собирается фильтровать. Если у вас 20 полей, вы не можете создать 2.432902e + 18 просмотров, необходимых для обработки всех комбинаций потенциальных критериев поиска. Можете ли вы иметь 20 просмотров, а затем попытаться каким-то образом пересечь взгляды? –

+0

CouchDB не является универсальной базой данных. Вы должны спроектировать структуру данных (схему и представления документов) для конкретного варианта использования. Хотя многомерные запросы и недоступны без дополнительных плагинов (например, GeoCouch или с использованием lucene/elasticsearch), вы можете попытаться избежать этого. Простой перевод SQL в представления и отображение реляционного дизайна в документы JSON недостаточно. –

0

Вам необходимо создать представление, содержащее [doc.name, doc state]. Это описано в документации достаточно хорошо. Реальная проблема заключается в том, как выбирать людей из двух случайных состояний.

Вот хорошая статья, отвечая на этот вопрос: Using Multiple Start and End Keys for CouchDB Views

Смежные вопросы