запрос представлений на диванной базе по вторичному индексу и упорядочиванию результатов

У меня есть документы в моем ведре:

{ type: "post", author: "1", subject: "s1", timestamp: 11}
{ type: "post", author: "1", subject: "s2", timestamp: 12}
{ type: "post", author: "2", subject: "s3", timestamp: 9 }
{ type: "post", author: "3", subject: "s4", timestamp: 10}
{ type: "post", author: "4", subject: "s5", timestamp: 14}
{ type: "post", author: "5", subject: "s6", timestamp: 11}

У меня есть вид:

function(doc, meta) { 
   if(doc.t === 'post') { 
     emit([doc.timestamp, doc.author]);  
   } 
} 

это дает мне:

[11, "1"]
[12, "1"]
[9,  "2"]
[10, "3"]
[14, "4"]
[11, "5"]

Я хочу выбрать сообщения определенных пользователей ["2","3","5"], упорядоченные по отметке времени. Я имею в виду «получать самые новые сообщения некоторых пользователей». Возможно ли это сделать?


person Łukasz    schedule 13.07.2015    source источник


Ответы (2)


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

doc name: "author:1"
doc: 
{ 'posts':[{'subject':'s1','body':'this is body1'},
           {'subject':'s2','body':'this is body2'}] }

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

person FuzzyAmi    schedule 06.08.2015

Массив ключей просмотра имеет дело с его (естественным) порядком. Если вы хотите «конкретного» пользователя: скажем, точного соответствия пользователя с упорядоченной отметкой времени, функция просмотра будет выглядеть так:

function(doc, meta) {
    if(doc.type === 'post') { 
        emit([doc.author, doc.timestamp], null);
    }
}

с этим точным автором 1, диапазон отметок времени 1–100
startkey: [1, 1]
endkey: [1, 100]

результаты:
[1, 11]
[1, 12]

НО, если вам нужны оба атрибута с диапазоном...

автор: 1~10
метка времени: 1~100

Это следует за испускаемым порядком 'ARRAY'; более 2 атрибутов с запросом диапазона не будут возвращены желаемым образом.
Если вам нужен другой тип отсортированного результата с несколькими атрибутами «диапазона», вы должны состоять из функции просмотра.

person Intae Kim    schedule 05.11.2015