結論、ElasticSearchを使って実現します

このページを見ている人は、下記のいずれかの勘違いをしていると思う。

  • GraphQLクエリー発行時にorder_by的な指定が可能ではないか?
  • @keyでレンジキーに追加すればソート指定できるでしょ?

後者の方は、後述のGSIとLSIについてまず理解して欲しい。

グローバルセカンダリインデックス(GSI)についておさらい

あるテーブルをベースに、異なるパーティションキー・ソートキーのテーブルを作成する仕組みを。

ローカルセカンダリインデックス(LSI)についておさらい

あるテーブルをベースに、パーティションキーはそのままに、異なるソートキーのテーブルを作成する仕組み。

実現する方法は2パターン

下記のいずれかで実現可能かと思います。

  • ElacticSearchで解決(私はこれを採用しています)
  • LSIを作成し異なるキー情報でソートかけたテーブルをもう一つ作成

LGIの思想でテーブル情報が増えると何がなんだかよく分からなくなってくる可能性があるし、ElasticSearchあるんだから使えばいいんじゃん。というのが感想です。(あと誰かが、Dynamo設計のベストプラクティスは「テーブルを個数を極小にすること」と言っていたのを覚えている)

ではソースコードをペタする。

schema.graphql

type Product
@model
@searchable
{
  id: ID!
  name: String!
  createdAt: AWSDateTime!
  updatedAt: AWSDateTime!
}

queries.js

export const searchProduct = /* GraphQL */ `
  query SearchClients(
    $filter: SearchableProductFilterInput
    $sort: SearchableProductSortInput
    $limit: Int
    $nextToken: String
  ) {
    searchProduct(
      filter: $filter
      sort: $sort
      limit: $limit
      nextToken: $nextToken
    ) {
      items {
        id
        name
        createdAt
        updatedAt
      }
      nextToken
      total
    }
  }
`;

sample.js

import {API, graphqlOperation} from 'aws-amplify'
import {searchProduct} from '~/src/graphql/queries'

const queryArgument = Object.assign({},{
  sort : { // Defaultはパーティションキー順になってしまうので対策
      field: 'createdAt',
      direction: 'desc'
  },
  limit : 30
})

const res = await API.graphql(graphqlOperation(searchProduct, queryArgument))
console.log(res)
// res.data.searchProduct.itemsが作成日順に!🎉🎉

奥深き、Amplify。