2013-03-06 4 views
0

У меня есть база данных couchDB, которая имеет несколько разных типов документов, которые все относятся к основному «типу».couchDB сортировочный комплексный ключ

В общий блог/пост Например, основной тип является блог, а остальные комментарии (хотя есть 3 различных типа комментариев.

Все типы имеют дату на них, однако Я хочу, чтобы сортировать сообщения пользователя по дате, но вернуть все данные из замечаний, а я могу написать Emit, который производит ключи так:.

[date, postID, docTypeNumber] 

где docTypeNumber является 1 для поста и> 1 для различные типы документов комментариев.

eg:

["2013-03-01", 101, 1] 
[null, 101, 2] 
[null, 101, 2] 
[null, 101, 3] 
["2013-03-02", 101, 1] 
[null, 102, 2] 
[null, 102, 3] 

Конечно, если я испущу это, все нули будут отсортированы вместе. Есть ли способ игнорировать нули и группировать их по элементу seccond в массиве, но сортировать их по первому, если он не равен нулю?

Или, мне нужно получить все документы для записи даты публикации, чтобы сортировать работу?

Я не хочу использовать списки, они слишком медленны, и я имею дело с потенциально большим набором данных.

ответ

0

Вы можете сделать это, используя условные обозначения в вашей функции карты.

if(date != null) { 
    emit([date, postID, docTypeNumber]); 
} 
else { 
    emit([postID, docTypeNumber]); 
} 

Я не знаю, хотите ли вы, чтобы длина вашего массива была переменной или нет. Если нет, вы можете сначала добавить переменную сортировки. Следующий снипп может работать с даты, а postID, по-видимому, никогда не имеет одинаковых значений.

if(date != null) { 
    sortValue = date; 
} 
else { 
    sortValue = postID; 
} 
emit(sortValue, date, postID, docTypeNumber); 

Обновление: Я подумал об этом еще немного. В общем, я делаю свои представления на основе запросов, которые я хочу выполнить. Поэтому я спрашиваю себя: что мне нужно для запроса? Кажется, что в вашем случае у вас может есть два разных запроса здесь. Если это так, я предлагаю иметь два разных мнения. Существует штраф за исполнение, поскольку вы будете запускать два представления вместо одного, но я сомневаюсь, что это воспринимается пользователем. И это может занять больше места на диске. Преимущество для вас было бы более ясным и более явным кодом.

+0

Спасибо за ваш ответ. Я думаю, что здесь что-то не хватает. С первым вариантом не сортирует ли он по первому элементу массива? Если нет, то как он знает сортировать по postID? Я очень взволнован вашим ответом, если вы правы couchDB только лучше для меня. – ddouglascarr

+0

Я думаю, что предпочел бы вторую форму над 1-м. Однако первый по-прежнему будет работать. Ваша сортировка просмотров для сообщений будет эффективно '[101, x]'. Соответствие вашей даты для дат будет чем-то вроде '[2013-03-07, x, x]'. И вы также можете запросить дату и дату '[2012-03-07, 101, x]'. Обратите внимание, что оба представления зависят от того, что postID и дата никогда не имеют одинакового значения. –

+0

Ни один из вариантов не работает, когда я запрашиваю представление. Он сортируется с передней стороны массива, поэтому сравнивает postID post с датой комментария. Все ваши идентификаторы сообщений указаны, а затем все ваши сообщения. Есть ли опция, которую вы можете передать, когда вы запрашиваете представление, чтобы сделать его другим? – ddouglascarr

0

Кажется, что вы хотите отсортировать все данные (как сообщение, так и комментарии) с датой публикации. Так как в вашем документе комментариев к проекту не содержится дата публикации (только дата комментария), это сложно с помощью шаблона сопоставления вида. Я предлагаю изменить дизайн базы данных, чтобы иметь идентификатор почтового ящика значимый и содержать дату, например. конкатенированная дата с идентификатором автора. Таким образом, если вы опубликуете [doc._id, doc.type] из сообщения и [doc.post, doc.type] из документа комментария, у вас будет сообщение и комментарии, сгруппированные и отсортированные по дате.

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