2015-12-07 4 views
1

У меня довольно большая база данных CouchDB (около 3 миллионов документов). У меня есть разные функции просмотра, возвращающие срезы данных, которые нельзя изменить (или, по крайней мере, следует только модифицировать как крайнее средство).Сортировка по неключевому (произвольному) полю в CouchDB

Мне нужна возможность сортировки в произвольном поле для целей отчетности. Для небольших БД я возвращаю весь объект, json_parse его в наш PHP-сервер, а затем сортирую там. Тем не менее, мы часто получаем ошибки Out Of Memory, когда делаем это на наших крупнейших БД.

После некоторых исследований я склоняюсь к доступу к ключу сортировки (через параметр URL) в list function и выполняя сортировку там. Это идея, которую я украл from here. Выдержки:

function(head, req) { 
    var row 
    var rows=[] 
    while(row = getRow()) { 
    rows.push(row) 
    } 
    rows.sort(function(a,b) { 
    return b.value-a.value 
    }) 
    send(JSON.stringify({"rows" : rows})) 
} 

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

Это:

a) хорошее решение?
б) собирается работать с 3, 5 или 10 миллионами строк?

ответ

0

В нашей среде у нас есть более 5 миллионов записей. Кушетка спроектирована таким образом, что каждый Документ имеет определенные поля, которые отличают его от другой категории документов.

Например, есть количество документов с поля DocumentType «пользователь» или DocumentType «XXX»

Эти поля DocumentType позволяют нам сортировать различные документы на основе различных категорий. Итак, если у вас есть 3 миллиона документов, и у вас есть около 10 категорий, поэтому каждая категория будет иметь около 300 тысяч документов.

Теперь вы можете проектировать систему таким образом, чтобы вы всегда проходили DocId, вам нужно передать Couch. Таким образом, это будет быстрее.

так запрос может быть как

function(doc) 
{ 
if(doc.DocumentType=== 'XXX' && doc._id) {emit(doc.FieldYouWant, doc._id)} 
} 

Это как наш наотмашь разработан в производстве.

+0

Это не отвечает на мой вопрос ... Это не имеет никакого отношения к сортировке. Как вы могли бы отсортировать это по 'doc.SomeOtherField'? –

+0

Получите все поле в списке в Webservice Layer, а затем откорректируйте его. Это будет быстрее и будет меньше напряжения на Couch –

1

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

Если вы можете жить в пределах ограничений памяти, это разумное решение с некоторыми преимуществами.

В противном случае исследуйте, используя что-то вроде lucene, elasticsearch или Cloudant Search (clouseau & dreyfus).

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