LoginSignup
2
1

More than 1 year has passed since last update.

Amplify +GraphQL+DynamoDBでリストの並びを時系列順にする

Last updated at Posted at 2021-06-05

はじめに

私はAWSのサービスで一番最初に触ったのがAmplifyでした。
AWSのサービスを何も知らなかったのでドキュメントを読みつつ実際に手を動かし、トライアンドエラーしたことでAmplifyとAWSについて少しは理解ができたかなと思います。

その中で振り返ってみて個人的にかなり苦戦した、データを時系列順で取得する方法について、記事にしたいと思います。
※ちなみに以前も同じような内容の記事を書きました。その時は曖昧な理解でしたので、理解が深まったこのタイミングで改めて記事にしています。

私が把握している時系列順にデータを取得する方法は以下の二つです。
①GraphQLのスキーマ定義時にsearchableを使う
②GraphQLのスキーマ定義時にkeyを使う

①はElasticsearchを使用するので②に比べて費用がかかってしまいます。
なので今回は②の方法にします。

方法

上でも記載しましたが今回はGraphQLのスキーマ定義時にkeyを使う方法でやってみたいと思います。
と言ってもかなり簡単に実装出来ます。

type Todo 
 @model
 @key(name: "SortByTime", fields:["type", "createdAt"], queryField: "listTodosSortedByTime" )
{
    id: ID! 
    name: String!
    type: String!
  //このtypeに固定値をいれる。
    content: String!
    updatedAt: AWSDateTime 
    createdAt: AWSDateTime 
}

↑のようにスキーマ定義時にkeyを持たせるだけです。
nameセカンダリインデックスを指定可能。
fieldはパーテンションキーやソートキーを指定可能。
queryFieldを設定することで、セカンダリインデックスを使ったクエリでの検索が可能。

今回の例ではtype(filedsの第一引数)をパーテンションキーに指定しています。
なので、typeに常に同じ値を入れるようにすれば、リスト全体が範囲になります。
そのリスト全体の範囲に対してcreatedAt(filedsの第二引数)でソートすることが可能です。

あとはqueryで呼び出す際に下記のようにすれば、リスト全体を時系列順で取得することができます。

  API.graphql(graphqlOperation(listPostsSortedByTimestamp, {
    type: "todo",
//今回の例では常にtypeにはtodoを入れる
    sortDirection: 'DESC',
//降順
    limit: 20, 
//取得件数(デフォルトは10件)
    nextToken: nextToken,
  }));

↑の例ではtypeにtodoを入れていますが、そこはお好みの値がOKです。
また、typeではなくownerをfiledsの第一引数にすれば、投稿した人(オーナー)を時系列順で取得できます。

最後に

このようにまとめてみると何故苦戦したのか分からない程、簡単に実装できたなと思います。
もし他にも方法があれば教えていただけると幸いです!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1