BioErrorLog Tech Blog

試行錯誤の記録

Amplify & AppSyncで時系列データを日付範囲でList取得する

AWS Amplify (AppSync)で、時系列データをある日付の範囲でList取得する方法を記します。


はじめに

おはよう。@bioerrorlogです。

例えば以下のようなGraphQL schemaでデータモデルTimeStampが定義されてるとします。

type TimeStamp @model 
@key(fields: ["id", "createdAt"]){
  id: ID!
  createdAt: AWSDateTime!
}

このようなモデルをcreatedAtに対して一定の日付範囲で取得するやり方を備忘録に残します。


Amplify & AppSyncで時系列データを日付範囲でList取得する

ケース1: 全List取得に対する日付範囲での絞りこみ

全List取得に対してある一定の日付範囲で絞りこむには、以下のようにfilterを用いたQueryが使えます:

query MyQuery {
  listTimeStamps(filter: {createdAt: {between: ["2020-09-14T00:00:00.000Z", "2020-09-16T00:00:00.000Z"]}}) {
    items {
      id
      createdAt
    }
    nextToken
  }
}

上記Queryに対しては、以下のようにcreatedAtが絞られたListデータが取得できます:

{
  "data": {
    "listTimeStamps": {
      "items": [
        {
          "id": "0001",
          "createdAt": "2020-09-14T22:12:30.461Z"
        },
        {
          "id": "0001",
          "createdAt": "2020-09-15T22:11:30.461Z"
        },
        {
          "id": "0002",
          "createdAt": "2020-09-14T22:10:30.461Z"
        },
        {
          "id": "0002",
          "createdAt": "2020-09-15T22:10:30.461Z"
        }
      ],
      "nextToken": null
    }
  }
}


[関連記事] Amplify & GraphQLでのデータモデル設計事例集


ケース2: Partition keyを指定した上での日付範囲の絞りこみ

特定のPartition key (今回はid) を指定した上で日付範囲を絞ったデータを取得するには、以下のようなQueryが使えます:

query MyQuery {
  listTimeStamps(id: "0001", createdAt: {between: ["2020-09-14T00:00:00.000Z", "2020-09-16T00:00:00.000Z"]}) {
    items {
      id
      createdAt
    }
    nextToken
  }
}

上記Queryに対して、以下のようにidcreatedAtが絞られたListデータが取得できます:

{
  "data": {
    "listTimeStamps": {
      "items": [
        {
          "id": "0001",
          "createdAt": "2020-09-14T22:12:30.461Z"
        },
        {
          "id": "0001",
          "createdAt": "2020-09-15T22:11:30.461Z"
        }
      ],
      "nextToken": null
    }
  }
}


[関連記事] Amplifyプロジェクトのgitリポジトリを公開するときの注意点


使用データ

今回使用した全データは以下です:

{
  "data": {
    "listTimeStamps": {
      "items": [
        {
          "id": "0001",
          "createdAt": "2020-09-13T22:12:30.461Z"
        },
        {
          "id": "0001",
          "createdAt": "2020-09-14T22:12:30.461Z"
        },
        {
          "id": "0001",
          "createdAt": "2020-09-15T22:11:30.461Z"
        },
        {
          "id": "0001",
          "createdAt": "2020-09-16T11:11:11.111Z"
        },
        {
          "id": "0002",
          "createdAt": "2020-09-13T21:12:30.461Z"
        },
        {
          "id": "0002",
          "createdAt": "2020-09-14T22:10:30.461Z"
        },
        {
          "id": "0002",
          "createdAt": "2020-09-15T22:10:30.461Z"
        },
        {
          "id": "0002",
          "createdAt": "2020-09-16T10:11:11.111Z"
        }
      ],
      "nextToken": null
    }
  }
}


おわりに

以上、Amplify & AppSyncで時系列データを日付範囲でList取得する方法を記しました。

背景として、日付範囲を絞って取得するにはElasticSearchを噛ませる必要があるのか?などと色々迷った経緯があります。 結果としてElasticSearchを利用しなくとも日付範囲を絞った取得が出来たので、今回のメモを書くに至りました。

ただ、処理コスト面やfilterを使う場合と使わない場合の違いなど、まだ理解していない部分はたくさんあります。

引き続き分からないところは調べていく所存です。


参考

Data Modeling in Depth with GraphQL & AWS Amplify - 17 Data Access Patterns - DEV Community

Amplify Framework Documentation

elasticsearch - AppSync - query for all items created within a date range? - Stack Overflow