AppSync - запросить все элементы, созданные в диапазоне дат?

Я пытаюсь запросить мои элементы (у которых есть поля AWS DateTime of CreatedAt и updatedAt) для всех в пределах определенного диапазона дат. Например, последние 48 часов.

Например, используя эту схему:

type Note @model @searchable @auth(rules: [{ allow: owner }]) {
  id: ID!
  note: String
  createdAt: AWSDateTime

Я могу искать даты, используя, например:

query {
  searchNotes(filter:{createdAt: { matchPhrasePrefix: "2018-12-27"}}) {
    items{
      id
        title
      createdAt
    }
  }
}

Который возвращает все заметки, которые соответствуют времени UTC с этим строковым префиксом.

Из которого я должен сортировать себя с помощью moment.diff() или каким-либо другим методом.

Я не уверен, что есть лучший / более эффективный способ поиска / фильтрации по датам и времени, используя AppSync и GraphQl?

Спасибо.

1 ответ

Решение

На момент написания статьи (3 января 2019 г.) самый простой способ сделать это - сохранить дату в виде целого числа (например, секунд с начала эпохи), которое открыло бы gt, lt, gte, ... поля фильтра на автоматически сгенерированных входных фильтрах резольвера поиска.

Другое решение - написать собственный распознаватель с помощью консоли AWS AppSync или собственного стека CloudFormation. При написании собственного распознавателя вы можете использовать весь DSL Elasticsearch для реализации всех видов запросов (см. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html)., Чтобы пойти по этому пути, вы можете добавить свое собственное поле поиска к типу запроса в своей схеме и написать собственный преобразователь.

type Query {
  searchNotesByCreatedAt(start: String!, end: String!): NotesConnection
}

Затем через консоль или через собственный стек CloudFormation вы можете написать решатель, подобный этому:

{
  "version": "2017-02-28",
  "operation": "GET",
  "path": "/note-<your-api-id>/doc/_search", // created by amplify
  "params": {
    "body": {
      "sort": [{ "createdAt" : {"order" : "desc"}}],
      "query": {
        "range" : {
            "createdAt" : {
                "gte": $ctx.args.start, 
                "lte": $ctx.args.end
            }
        }
      }
    }
  }
}

Вам потребуется только временно развернуть этот преобразователь с помощью консоли или собственного стека CF. Ведется работа, чтобы вы могли написать свои собственные распознаватели из CLI-интерфейса усиления. Для получения дополнительной информации о том, как это будет работать, см. https://github.com/aws-amplify/amplify-cli/issues/574.

Дайте мне знать, если это работает для вас.

Вы можете использовать этот запрос для фильтрации 2 AWSDateTime:

query {
  searchNotes(filter:{createdAt: { between: ["2018-12-27T00:00:00", "2019-01-27T00:00:00"]}}) {
    items{
      id
        title
      createdAt
    }
  }
}

Другие вопросы по тегам