Комплексный ключ - фильтр по первому ключу и сортировка только по второму ключу - PullRequest
0 голосов
/ 12 сентября 2018

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

ТакжеСледующий вопрос не содержит соответствующего решения:

Фильтр Couch DB по ключу и сортировка по другому полю

Ниже приведен упрощенный вариант кода, чтобы дать представлениеиз того, что я сейчас пытаюсь (имя_службы должно быть первым ключом, так как я не могу фильтровать исключительно со вторым ключом):

function(doc) { 
    if(doc.type && doc.type=="incident"){
        emit([doc.serviceName, doc.date], doc)
    }
 };

Вот фрагмент, где из моего API, написанного в Node, который строит параметры дляquery:

if (req.query.search !== "") {
    const search = req.query.search;
    params = { 
        limit: limit, 
        skip: skip, 
        startkey: [search+"Z"], 
        endkey: [search], 
        descending:true, 
        include_docs: true 
    };
} else {
    params = { limit: limit, skip: skip, descending:true, include_docs: true };

Приведенный выше код в настоящее время фильтрует имя службы, но также сортирует по имени службы перед сортировкой по дате.Есть ли что-нибудь, что я могу добавить, например (проверьте фрагмент ниже), чтобы заставить запрос сортировать результаты по дате без необходимости делать это в коде после получения результата.

const sort = [{'date': 'desc'}];

То, что я хочу, эточто-то вроде этого при фильтрации по имени_службы:

SELECT * FROM incidents
    WHERE serviceName LIKE @search+'%'
    ORDER BY date DESC

Но при фильтрации не по имени_службы:

SELECT * FROM incidents
ORDER BY date DESC

1 Ответ

0 голосов
/ 13 сентября 2018

Один из способов сделать это - убедиться, что второй элемент массива, который вы генерируете (бит, связанный с датой), уменьшается с течением времени.Это может быть достигнуто с помощью небольшого взлома в функции карты

function(doc) {
  if(doc.type && doc.type=="incident") {

     // get the date from the document
     var d = doc.date;

     // remove dash characters
     var d1 = d.replace(/\-/g,'');

     // convert to integer
     var d2 = parseInt(d1)

     // Subtract from number representing the year 3000
     emit([doc.serviceName, 30000000 - d2], doc)
  }
}

Теперь вы можете запросить это представление в порядке возрастания (без descending=true), и данные будут отсортированы по serviceName и времени (в обратном порядке).).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...