はじめに

まず、@connectionはあくまでもデータをIDでマッピングして取得するだけなので、@connectionに対して細かなフィルターは指定できません。そのため、N対Nの設計に則り設計を行いましょう。

N対Nの設定方法

例えば、下記のようなシステム管理者を保持するスキーマ構造を考えます。

  • ロールは、様々なシステムに対応するためにN個存在
  • ロールは、1ユーザーにN個設定が可能
type User
{
  id: ID!
  name: String!
}

type Role
{
  id : ID!
  title: String!
}

上記に対し、N対Nの情報を持つマッピングテーブルを作成します。
参考:https://docs.amplify.aws/cli/graphql-transformer/directives#belongs-to

type User
{
  id: ID!
  name: String!
  roles: [UserRole] @connection(keyName: "byUser", fields: ["id"])
}

type UserRole
  @model(queries: null)
  @key(name: "byUser", fields: ["userID", "roleID"])
  @key(name: "byRole", fields: ["roleID", "userID"]) {
  id: ID!
  userID: ID!
  roleID: ID!
  user: User! @connection(fields: ["userID"])
  role: Role! @connection(fields: ["roleID"])
}

type Role
{
  id : ID!
  title: String!
  users: [UserRole] @connection(keyName: "byRole", fields: ["id"])
}

これで、ロールに属するユーザ一覧、ユーザーに設定されているロール一覧を取得することが可能です。

尚、その範囲の中でフィルターをしたい場合(複雑な探索をしたい)は、ElasticSearchの導入を推奨します。
クエリーフィルターを実行した場合DynamoDBのリードキャパシティユニットを消費してしまいレイテンシーが高くなってしまう可能性が高いので。