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
}
}
}