Проблемы со сложными ключами CouchDB - за диапазон берутся только первые две части массива

Что-то не так с моей сложной обработкой запросов CouchDB.

У меня есть функция карты, которая выдает сложный ключ, состоящий из 6 параметров, например:

emit([doc.profileId,  doc.beamId, doc.name, doc.beambeanchId, "true", attachName], {beamdocId:doc._id, attachName:attachName})

мои параметры запроса (coffescript) такие:

params =
startkey:[ profileId, beamId, namePrefix, beambeanchId, hasAttach, attachNamePrefix]
endkey:[
  profileId or "\ufff0",
  beamId or "\ufff0",
  namePrefixEnd or "\ufff0",
  beambeanchId or "\ufff0",
  hasAttachEnd,
  attachNamePrefixEnd or "\ufff0"]

Проблема в том, что только два первых работают нормально, а остальные вообще не фильтруют. Например, когда я устанавливаю для namePrefixEnd значение, отличное от нуля, это не уменьшает мой результат.

Я пробовал это с ключами, испускаемыми как объекты и массивы. Та же история, работают только первые два. Третий игнорируется. Когда я меняю порядок, например, beamId с namePrefixEnd, только первые два работают правильно.

Есть идеи, что не так? Существуют ли какие-либо ограничения на количество параметров в сложных ключах CouchDB?

Я использую библиотеку nano для доступа к данным и функции db.view.


person Luman75    schedule 12.08.2013    source источник


Ответы (1)


Ok. Я нашел ответ сам. В общем случае структура ключа в startkey/endkey должна точно соответствовать выдаваемым ключам.

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

Например:

emit([doc.profileId,  doc.beamId, doc.name, doc.beambeanchId, "true", attachName],
     {beamdocId:doc._id, attachName:attachName})
emit([doc.profileId,  doc.name, doc.beambeanchId, "true", attachName],
     {beamdocId:doc._id, attachName:attachName})
emit([doc.profileId,  doc.name, doc.beambeanchId, "true", attachName],
     {beamdocId:doc._id, attachName:attachName})
emit([doc.profileId,  doc.beambeanchId, "true", attachName],
     {beamdocId:doc._id, attachName:attachName})
emit([doc.profileId, attachName],
     {beamdocId:doc._id, attachName:attachName})

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

person Luman75    schedule 19.08.2013