CouchDB отобразить / уменьшить на любое свойство документа во время выполнения? - PullRequest
4 голосов
/ 28 июня 2011

Я пришел из мира SQL, где поиск выполняется по нескольким свойствам объекта (опубликовано = TRUE или user_id = X), и нигде нет объединений (из-за уровня кэша 1: 1).Похоже, что база данных документов подойдет для моих данных.

Я пытаюсь выяснить, есть ли способ передать одно (или несколько) свойств объекта на карту CouchDB /уменьшить функцию для поиска подходящих документов в базе данных без создания десятков представлений для каждого типа документа.

Можно ли передать требуемый ключ (и) свойств документасопоставить во время выполнения с CouchDB и вернуть ему соответствующие объекты (или количество объектов, соответствующих пагинации)?

Например, на одной странице я хочу, чтобы все сообщения с doc.user_id из X, которые doc.published.На другой странице мне могут потребоваться все документы с doc.tags[] с тегом «спорт».

Ответы [ 3 ]

6 голосов
/ 28 июня 2011

Вы можете создать представление, которое перебирает ключи в документе и выдает ключ [propertyName, propertyValue] - таким образом вы создаете один индекс с ВСЕМ проп / значением в нем.Это было бы массово, не знаю, как будет расти производительность и использование диска (вероятно, плохо).

Функция карты будет выглядеть примерно так:

// note - totally untested, my CouchDB fu is rusty
function(doc) {
  for(prop in doc) {
    emit([prop, doc[prop]], null);
  }
}

Работает для простого случая простогосвойства, и могут быть расширены, чтобы быть умными в отношении массивов и испускать пару проп / значение для каждого элемента в массиве.Это позволило бы вам обрабатывать теги.

Для запроса по нему установите [prop] в качестве ключа запроса в представлении.

2 голосов
/ 28 июня 2011

В основном, нет.

Ключевое различие между чем-то вроде Couch и SQL DB заключается в том, что единственный способ запроса в CouchDB - это, по сути, просмотр / индексирование.Индексы в SQL являются необязательными.Они существуют (в основном) для повышения производительности.Например, если у вас небольшая БД, ваше приложение будет отлично работать на SQL с 0 индексами.(Может быть некоторая проблема с уникальными ограничениями, но это деталь.)

В целом дело в том, что часть обработчика запросов в базе данных SQL включает другие методы доступа к данным, помимо простых индексов, в частности, сканирование таблиц,объединение объединений и т. д.

В Couch нет обработчика запросов.У него есть представления (определенные JS), используемые для определения индексов B-Tree.

И это все.Это молот кушетки.Это хороший молоток.Мир обработки данных длится в основном 40 лет.

Создание индексов в Couch довольно дорого (на основе объема данных), поэтому «временные представления» не одобряются.Кроме того, они требуют затрат на обслуживание, поэтому представления должны быть осознанным элементом дизайна в вашей базе данных.В то же время, они немного более мощные, чем обычные индексы SQL.

Вы можете легко добавить свою собственную обработку запросов поверх Couch, но это будет больше работать для вас.Вы можете создать несколько избранных представлений по самым популярным или выборочным критериям, а затем отфильтровать полученные документы по другим критериям в своем собственном коде.Да, вы должны это сделать, поэтому вам нужно задаться вопросом, стоит ли затраченное усилие больше, чем любые преимущества, которые вы считаете Couch предлагает (HTTP API, репликация, безопасное, всегда согласованное хранилище данных и т. Д.) По сравнению с решением SQL.1013 *

0 голосов
/ 29 июня 2011

Я столкнулся с подобной проблемой, подобной этой, и создал быстрый обходной путь, используя CouchDB-Python (который является отличной библиотекой). Это не симпатичное решение (идет вразрез с принципами CouchDB), но оно работает.

CouchDB-Python предоставляет вам функцию «Запрос», которая позволяет вам «выполнить временное специальное представление для базы данных». Вы можете прочитать об этом здесь

У меня есть то, что я храню функцию javascript как строку в python и объединяю ее с именами переменных, которые я определяю в Python.

В some_function.py

variable = value

# Map function (in javascript)
map_fn = """function(doc) {
     <javascript code>
     var survey_match = """ + variable + """;
     <javascript code>
"""

# Iterates through rows
for row in db.query(map_fn):
     <python code>

Конечно, это не красиво, и, вероятно, нарушает философию CouchDB, но это работает.

D

...