【问题标题】:AppSync - query for all items created within a date range?AppSync - 查询在日期范围内创建的所有项目?
【发布时间】:2019-05-28 22:51:55
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: elasticsearch graphql aws-appsync aws-amplify amplifyjs


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。这是一项新功能/能力吗?
    • @stephenlizcano 我不这么认为,AWSDateTime 被序列化为可排序的字符串,因此您可以使用与字符串操作相同的操作
    • 这是正确的方法,应该是最佳答案。也可用于AWSDate 字段。
    • 这不再可能使用 ElasticSearch,因为 between 谓词已被删除。但是,可以使用列表查询来完成。
    • 要从 graphQL 访问 createdAt,您必须将其添加到您的模型架构中。请记住,这可能会允许这些部分在它们最初受保护的位置进行更新。
    【解决方案2】:

    截至撰写本文时(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 堆栈部署此解析器。正在开展工作以允许您从放大 CLI 中编写自己的解析器。有关其工作原理的更多信息,请参阅https://github.com/aws-amplify/amplify-cli/issues/574

    让我知道这是否适合你。

    【讨论】:

    • 这是一个彻底且非常有益的答案。谢谢!实际上,我确实最终采用了您推荐的第一种方法,将日期存储在 Unix Epoch 时间中,这是一个整数并以这种方式排序。
    • 现在支持自定义解析器,方法如下:aws-amplify.github.io/docs/cli/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多