Как создать поддержку «Tagging» с помощью CouchDB? - PullRequest
4 голосов
/ 17 октября 2008

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

def by_tag(tag):
return  '''
        function(doc) {
            if (doc.tags.length > 0) {
                for (var tag in doc.tags) {
                    if (doc.tags[tag] == "%s") {
                        emit(doc.published, doc)
                    }
                }
            }
        };
        ''' % tag

Ответы [ 4 ]

7 голосов
/ 17 октября 2008

Отказ от ответственности: я не проверял это и не знаю, может ли он работать лучше.

Создание одного вида пермиссии:

function(doc) {
  for (var tag in doc.tags) {
    emit([tag, doc.published], doc)
  }
};

и запрос с _view / your_view / all? startkey = ['your_tag_here'] & endkey = ['your_tag_here', {}]

Результирующая структура JSON будет немного отличаться, но вы все равно получите сортировку по дате публикации.

3 голосов
/ 19 октября 2008

Вы можете определить один постоянный вид, как предлагает Бахадир. однако при таком индексировании не выводит документ для каждого ключа. Вместо этого emit ([tag, doc.published], null). В текущих версиях выпусков вы должны были бы выполнить отдельный поиск для каждого документа, но теперь в стволе SVN есть поддержка указания «include_docs = True» в строке запроса, и CouchDB автоматически объединит документы в ваше представление для вас, без пространство над головой.

1 голос
/ 17 октября 2008

Вы очень на правильном пути с видом. Список мыслей, хотя:

Генерация представления является инкрементной. Если трафик чтения больше трафика записи, то ваши представления вообще не вызовут проблем. Люди, которые обеспокоены этим, вообще не должны быть. Ориентир: вы должны быть обеспокоены, если вы выводите сотни записей в представление без обновления.

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

Не уверен, какова будет производительность val == "% s", но не стоит слишком задумываться. Если есть массив тегов, вы должны генерировать теги. Если вы ожидаете, что массив тегов будет содержать не строки, тогда игнорируйте это.

0 голосов
/ 23 ноября 2008
# Works on CouchDB 0.8.0
from couchdb import Server # http://code.google.com/p/couchdb-python/

byTag = """
function(doc) {
if (doc.type == 'post' && doc.tags) {
    doc.tags.forEach(function(tag) {
        emit(tag, doc);
    });
}
}
"""

def findPostsByTag(self, tag):
    server = Server("http://localhost:1234")
    db = server['my_table']
    return [row for row in db.query(byTag, key = tag)]

Функция карты byTag возвращает данные с каждым уникальным тегом в «ключе», а затем каждое сообщение с этим тегом в value, поэтому, когда вы берете ключ = «mytag», он извлекает все сообщения с тегом « MyTag».

Я проверил это примерно с 10 записями, и, похоже, на запрос уходит около 0,0025 секунд, не уверен, насколько он эффективен с большими наборами данных.

...