6

我正在尝试查询特定日期范围内的所有项目(具有 CreatedAt 和 UpdatedAt 的 AWS DateTime 字段)。例如,过去 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 按日期和时间进行搜索/过滤?

谢谢你。

4

2 回答 2

13

您可以使用此查询过滤 2 AWSDateTime

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

于 2019-05-23T21:12:48.183 回答
10

在撰写本文时(2019 年 1 月 3 日),最简单的方法是将日期存储为整数(例如,自纪元以来的秒数),这将gt, lt, gte, ...在自动生成的搜索解析器过滤器输入上打开过滤器字段。

另一种解决方案是使用 AWS AppSync 控制台或您自己的 CloudFormation 堆栈编写您自己的解析器。在编写自己的解析器时,您可以利用整个 Elasticsearch DSL 来实现各种查询(请参阅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 堆栈部署此解析器。正在开展工作以允许您从 amplify CLI 中编写自己的解析器。有关其工作原理的更多信息,请参阅https://github.com/aws-amplify/amplify-cli/issues/574

让我知道这是否适合您。

于 2019-01-03T23:06:56.157 回答