2013-06-12 2 views
0

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

  • У меня есть набор «Перечисления» хранятся как документы
  • Каждый имеет «last_updated» поле, которое - как вы уже догадались - хранит в последний раз, поле было обновлено
  • Я хочу, чтобы быть в состоянии показать только те перечисления, которые были обновлены с некоторой заданной датой, но до сих пор сортировки списка по имени перечисления

Я создал Couchbase вид, как это:

function (doc, meta) { 
    var time_array; 
    if (doc.doc_type === "enum") { 
     if (doc.last_updated) { 
     time_array = doc.last_updated.split(/[- :]/); 
     } else { 
     time_array = [0,0,0,0,0,0]; 
    } 
    for(var i=0; i<time_array.length; i++) { time_array[i] = parseInt(time_array[i], 10); } 
    time_array.unshift(meta.id); 
    emit(time_array, null); 
} 

}

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

startkey = ["a",2012,0,0,0,0,0] 
endkey = ["Z",2014,0,0,0,0,0] 

Хотя список отсортирован по «ид» он ничего не фильтруя! Может ли кто-нибудь сказать мне, что я делаю неправильно? Есть ли лучший составной результат для достижения этих результатов?

ответ

1

В couchbase, когда вы запрашиваете представление по команде startkey - endkey, вы не можете фильтровать результаты по 2 или более свойствам. Couchbase имеет только один индекс, поэтому он будет фильтровать ваши результаты только по первому параметру. Таким образом, ваш запрос будет идентичен запрос с:

startkey = ["a"] 
endkey = ["Z"] 

Вот link завершить ответ на Филипе Манана, почему он не может быть отфильтрован по этим датам.

Вот цитата из него:

Для составных ключей (массивы), элементы сравниваются слева направо и сравнение заканчивается, как только элемент отличается от соответствующего элемента в другом ключе (то же самое, что и при сравнении строк à la memcmp() или strcmp()).

Так что если вы хотите иметь представление, которое фильтрует по дате, массив даты должен идти первым в составном ключе.

+0

Однако я не понимаю, что если я не привожу в строковый компонент и вместо этого просто использую элементы массива, которые являются различными аспектами даты и времени, я могу фильтровать с помощью start/end_key через к любому элементу массива, и кажется, что они также используются для сортировки. – ken

+0

Да. Couchbase сортирует результат по ключу, поэтому, если у вас есть сложный ключ, такой как '[doc.a, doc.b, doc.c]' docs будут сначала отсортированы по doc.a, тогда значения с одинаковым doc.a будут отсортированы по doc .b и так далее. Такое же поведение используется для фильтрации, если 'startkey: ['a', 'b', 'c']' и 'endkey: ['z', 'x', 'c']' couchbase найти все ключи, которые остаются только первое состояние. Но если у вас есть одинаковые значения в ключах запуска/завершения, таких как '['a', 'b']' и '['a', 'x']' couchbase будет выбирать документы с помощью 'doc.a = 'a'' и 'doc.b = 'b' .. 'x''. – m03geek

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