【问题标题】:AWS Amplify Datastore Query DatesAWS Amplify 数据存储查询日期
【发布时间】:2021-06-04 07:48:42
【问题描述】:

所以我想尝试一下 AWS Amplify,因为我开始的新项目将开始我们的简单但会变得更加复杂,因此我不想走 Firebase 路线。所以我设置了 Auth 并创建了我的数据模型并将 Amplify Lib 添加到我的 Angular 前端。我可以登录并读取我的数据。到目前为止一切顺利。

现在我想对我的数据进行基本查询。对于名称之类的内容,基于基本字符串字段的过滤很容易:

const members = await DataStore.query(Member, m => m.firstName("eq", "Steve"));

我似乎找不到任何关于如何查询日期等内容的文档?

我有一个名为 Event 的模型,并且您可以为事件进行典型的创建(注意字段 StartTimestampEndTimestamp):

await DataStore.save(
    new Event({
        "Title": "Lorem ipsum dolor sit amet",
        "StartTimestamp": "1970-01-01T12:30:23.999ZM",
        "EndTimestamp": "1970-01-01T12:30:23.999ZM",
        "Notes": "Lorem ipsum dolor sit amet"
    })
);

StartTimestampEndTimestamp 都属于 AWSDateTime 类型:

在提取事件数据时,我看到 JS 中的类型是字符串。那么如何查询日期呢?字符串比较无济于事。我知道 AWS Amplify 的底层数据库是 GraphQL,查询日期很容易,但我仍然受限于 Amplify DataStore Lib 为我提供的工作。

任何建议将不胜感激。

【问题讨论】:

    标签: amazon-web-services aws-amplify datastore


    【解决方案1】:

    我只想添加一些关于 AWS 和日期字段的额外信息。

    • AWStimestamp 是一个整数值,表示 1970-01-01-T00:00Z 之前或之后的秒数
    • AWSDateTime 是一个字符串字段,将时间戳表示为 ISO 8601 格式的字符串。

    更多信息AWS types reference

    两者都有其用途。

    • AWStimestamp 在数据库中占用的空间更少。
    • AWSDateTime 在调试时易于处理,因为它是人类可读的
    • 两者都按字典顺序正确排序
    • 两者都支持使用 'gt'、'lt'、'eq' 的查询谓词,AWStimestamp 将使用数字比较,AWSDateTime 将使用字符串比较

    如上所述,只需将变量日期值转换为 ISO 8601 格式的字符串表示。

    【讨论】:

      【解决方案2】:

      AWS Amplify 利用 AWS AppSync 管理底层 GraphQL。确实可以在 AWS Admin UI 中使用 AWSDateTime 类型的字段设置模型。在本地放大安装文件夹中,模型架构将该字段显示为字符串。 AppSync 确实确认 AWSDateTime 是extended ISO 8601 date and time string

      AWS Amplify Datastore documentation 仅提及谓词来过滤字符串、数字和列表的查询,而不是日期。这意味着您无法查询以下实际日期值(在 Angular 中)

      const members = await DataStore.query(Member, m => m.StartTimeStamp("lt", new Date()));
      

      但是,您可以利用 ISO 8601 日期字符串隐式为 lexicographically ordered 的想法来比较日期。然后,您可以通过首先将要比较的日期更改为适当 ISO 8601 格式的字符串然后进行字符串比较来进行查询。先前的搜索然后变成(在 Angular 中)

      const currentDate = this.datePipe.transform(new Date(), 'YYYY-MM-ddThh:mm:ss.SSS\'Z\'');
      const members = await DataStore.query(Member, m => m.StartTimeStamp("lt", currentDate));
      

      通过将要比较的日期转换为字符串,您可以使用字符串谓词过滤查询中的 AWSDateTime 字段。

      【讨论】:

        猜你喜欢
        • 2021-09-12
        • 2020-10-19
        • 1970-01-01
        • 2020-09-21
        • 2023-02-01
        • 2022-01-03
        • 1970-01-01
        • 2011-09-26
        • 2011-02-08
        相关资源
        最近更新 更多