フィルタと制限されたGraphSQLの制限


背景


データベースはDynamoDBによってホストされ、データを操作するためにMulticify Graphqlを使用しています.
アプリケーションのすべてのユーザーの情報が含まれているテーブルがあります.各ユーザはユーザグループに属し、ユーザーはグループのデータをCRUDすることができるだけでよいので、filter リストクエリのパラメータ.
また、NextTokenを使ってリストテーブルビューにページ化機能を実装しようとしました.私は一定の量のデータを得ることを期待していたlimit リストクエリのパラメータ.

何が起こったの


両方を指定する場合filter and limit , DynamoDBは最初に指定されたデータ量を得るlimit そして、これらのデータをフィルタリングして、フィルタリングされた応答をスローします.これは、応答データが以下で指定された値以下であることを示しますlimit パラメータ

問題の扱い方


まずスキーマのテーブル定義を変更しました.以下の通り.
から:
type Post
  @model
{
  id: ID!
  userGroupId: ID!
  author: String!
  title: String!
  content: String!
  createdAt: AWSDateTime!
}

type UserGroup @model {
  id: ID!
  name: String!
  posts: [Post] @connnection (keyName: "byUserGroup", fields: ["id"]
}
です.
type Post @model
  @key ( name: "byUserGroup", fields: ["userGroupId", "createdAt"], queryField: "listPostsByUserGroups")
{
  id: ID!
  userGroupId: ID!
  author: String!
  title: String!
  content: String!
  createdAt: AWSDateTime!
}

type UserGroup @model {
  id: ID!
  name: String!
  posts: [Post] @connnection (keyName: "byUserGroup", fields: ["id"]
}
私がしたすべては@キー部を加えていました.の最初のパラメータfields パーティションキー、2番目のソートキーです.
DynamoDBはパーティションキーで定義された分離パーティションにデータを保存します.ソートキーが定義されている場合、ソートキーでソートされた各パーティションにデータが保存されます.
表スキーマを再定義した後、使用できるようになりますlistPostsByUserGroups , で指定された名前queryField その他listPosts . クエリ名を指定できますqueryField .
query {
  listPostsByUserGroups (userGroupId: xxxxx, sortDirection: 'DESC', limit: 10) {
    items {
      author
      title
      content
      createdAt
    }
    nextToken
  }
}
新しいものを使ってlistPostsByUserGroups クエリでは、常にfilter 最後まで続くパラメータ.

結論


DynamoDbの動作は、Meginify Graphqlの初心者としてはとても難しかったです.私はまだ2つ以上の列でフィルタをしなければならない場合にこれを行う方法を知らない.例えば、私はAを計画していたdeletedAt 論理的な削除のための列とそれをフィルタします.私は自分の研究からは不可能だと結論しました.しかし、このコミュニティの誰もがこれについて解決策を持っているかどうか知りたいです.
また、Graphqlでページ付けを処理する方法を探している場合は、次の投稿は参考になります.