Couch DB фильтр по ключу и сортировка по другому полю - PullRequest
8 голосов
/ 19 января 2012

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

{
   "_id": "_design/test",
   "_rev": "6-cef7048c4fadf0daa67005fefe",
   "language": "javascript",
   "views": {
       "all": {
           "map": "function(doc) { if (doc.blogId) {emit(doc.key, doc);} }"
       }
   }
}

Однако результаты должны быть заказаны другим ключом (doc.anotherkey). Таким образом, используя ту же функцию, я могу добиться как фильтрации, так и упорядочения по другому ключу.

Спасибо

1 Ответ

7 голосов
/ 19 января 2012

Если вам нужно выполнить запрос только по одному key, вы можете использовать следующую карту:

function (doc) {
  if (doc.blogId) {
    emit([doc.key, doc.anotherkey], 1);
  }
}

и запрос для "KEY" с ?startkey=["KEY"]&endkey=["KEY",{}]&include_docs=true.

Здесь, согласно спецификации сортировки CouchDB :

  • ["KEY"] - это значение, которое меньше любого значения ["KEY","OTHER"] (поскольку более длинные массивы сортируются после их префиксов), но больше, чем любое значение ["KEY2","OTHER"] с "KEY2" < "KEY";
  • и ["KEY",{}] - это значение, превышающее любое значение ["KEY","OTHER"], , если doc.otherkey никогда не является объектом JSON (поскольку объекты JSON идут после любого другого значения JSON), но меньше, чем любое ["KEY2","OTHER"] с "KEY2" > "KEY".

Конечно, это не ограничивается строками. Любой тип значения будет работать, если сопоставление правильное.

Не забудьте URL кодировать значения в startkey и endkey. Например, используя curl и предполагая, что вашей базой данных является «DB»:

curl 'http://localhost:5984/DB/_design/test/_view/all?startkey=%5B%22KEY%22%5D&endkey=%5B%22KEY%22,%7B%7D%5D&include_docs=true'

Обратите внимание, что я использовал параметр запроса include_docs вместо того, чтобы выдавать весь документ с emit(..., doc), чтобы сэкономить место на диске. Параметры запроса задокументированы в Документация CouchDB .

Чтобы отсортировать результаты в порядке убывания, используйте параметр запроса descending=true и поменяйте местами значения startkey и endkey как , документированные в полном справочнике .

curl 'http://localhost:5984/DB/_design/test/_view/all?endkey=%5B%22KEY%22%5D&startkey=%5B%22KEY%22,%7B%7D%5D&include_docs=true&descending=true'
...