Как получить записи после определенной даты - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь получить записи, у которых поле "ffectiveDateOfAction " больше, чем октябрь'2017.Пожалуйста, найдите следующие 3 записи.

{
 "_id": "TRAN001",
 "_rev": "13-59a53069c1ebd6ecfc23ca1dea0ba28f",
 "effectiveDateOfAction": "10-30-2018",
 "employeeName": "Kumar,Vinoth",
 "transferReportID": "TRAN001",
 "~version": "76:0"
}

{
 "_id": "TRAN001",
 "_rev": "12-c320c61168f5d6d020f971124cb395f2",
 "effectiveDateOfAction": "05-10-2018",
 "employeeName": "Vinoth",
 "transferReportID": "TRAN002",
 "~version": "77:0"
}

{
 "_id": "TRAN003",
 "_rev": "16-567a15e9ea7e2349d4c24816e7eafda3",
 "effectiveDateOfAction": "10-20-2017",
 "employeeName": "Kumar",
 "transferReportID": "TRAN003",
 "~version": "78:0"
}

Пожалуйста, найдите мой запрос ниже, который я пробовал. Я проверяю, используя Project Fauxton.

{"selector": {"$and": [{"transferReportID": {"$ne": null}},{"effectiveDateOfAction": {"$gt": "10-31-2017"}}]}}

Пожалуйста, помогите мне получить правильный запрос.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Если возможно, измените формат даты на сортируемую форму, как сказал Глин Берд.Я бы предложил использовать ISO_8601 , это предпочтительнее для JSON (например, Javascript Date.toJSON ).

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

Пример: поместите в вашу базу данных проектный документ, подобный следующему:

{
  _id: '_design/employees',
  views: {
    by_action_date: {
      map: "function (doc) {\n        if (doc.effectiveDateOfAction && doc.employeeName) { // filter for employee docs\n          var dt = doc.effectiveDateOfAction.split('-'); // parse your date format\n          emit(`${dt[2]}-${dt[1]}-${dt[0]}`); // emit iso date as key\n        }\n      }"
    }
  }
}

Необходимо указать функцию mapкак строка в документе, отформатированная это:

function(doc) {
    if (doc.effectiveDateOfAction && doc.employeeName) { // filter for employee docs
      var dt = doc.effectiveDateOfAction.split('-'); // parse your date format
      emit(`${dt[2]}-${dt[1]}-${dt[0]}`); // emit iso date as key
    }
  }

Затем вы можете запросить ее, чтобы отсортировать сотрудников:
Используйте параметр include_docs = true, чтобы включить ваши настоящие документы.

/my-database/_design/employees/_view/by_action_date?include_docs=true

Затем вы также можете использовать параметры startkey и endkey для ограничения определенным периодом времени:

/my-database/_design/employees/_view/by_action_date?include_docs=true&startkey="2018-10-01"&endkey="2018-10-31"

Это вернет вам документы TRAN001 и TRAN002.

0 голосов
/ 23 ноября 2018

Поскольку в JSON нет собственного типа даты, важно хранить даты в формате, который имеет смысл во время запроса.Формат «Месяц-День-Год» может быть полезен при рендеринге дат для аудитории в США, но он не имеет большого смысла для запросов.

Я бы предложил формат «ГГГГ-ММ-ДД», например «2018-10-30" .В нем хранятся те же данные, что и раньше, но порядок сортировки происходит в порядке дат, поскольку годы длиннее, чем месяцы, а месяцы длиннее, чем дни.

Затем можно использовать запрос с помощью оператора "$ gte":

{
  "selector": {
    "effectiveDateOfAction": {
      "$gte": "2018-10-01"
     }
  }
}

Это читается как «выборка документов, чье поле «ffectiveDateOfAction» больше или равно 1 октября 2018 года ».

См. это сообщение в блоге о том, какхранить и запрашивать даты в CouchDB.

...