Композитные виды на диване

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

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

Я создал Couchbase View следующим образом:

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]

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


person ken    schedule 12.06.2013    source источник


Ответы (1)


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

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

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

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

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

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

person m03geek    schedule 13.06.2013
comment
Однако я не понимаю, что если я не добавлю строковый компонент, а вместо этого просто использую элементы массива, которые являются различными аспектами даты и времени, я могу фильтровать с помощью start/end_key любой элемент массива, и кажется, что они также используются для целей сортировки. - person ken; 14.06.2013
comment
да. Couchbase сортирует результат по ключу, поэтому, если у вас есть сложный ключ, такой как [doc.a, doc.b, doc.c], документы будут сначала отсортированы по 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'. - person m03geek; 15.06.2013