はじめに
皆さん。こんにちは! DreamHanksのエルムです。
今回はデータの操作方法について説明していきます。
前回の記事はデータストアの設定です。
作成・更新 (Create and update)
まず始めに、DataStore APIをインポートします:
1 |
import { DataStore } from 'aws-amplify'; |
DataStoreにデータを書き込むには、モデルのインスタンスをAmplify.DataStore.save()に渡します:
1 2 3 4 5 6 7 |
await DataStore.save( new Post({ title: "My First Post", rating: 10, status: PostStatus.DRAFT }) ); |
saveメソッドは、新しいレコードを作成しますが、ローカルストアにすでにレコードが存在する場合は、そのレコードを更新します。
1 2 3 4 5 6 7 |
const original = await DataStore.query(Post, "123"); await DataStore.save( Post.copyOf(original, updated => { updated.title = `title ${Date.now()}`; }) ); |
DataStoreのモデルは不変です。レコードを更新するには、インスタンスを直接変異させるのではなく、copyOf関数を使用してアイテムのフィールドに更新を適用する必要があります。
削除 (Delete)
アイテムを削除するには、インスタンスを渡すだけです。
1 2 |
const todelete = await DataStore.query(Post, "1234567"); DataStore.delete(todelete); |
述語演算子を渡して、複数のアイテムを削除することもできます。
例えば、すべての下書き投稿を削除します:
1 |
await DataStore.delete(Post, post => post.status("eq", PostStatus.DRAFT)); |
さらに、モデルのインスタンスを渡すことで、例えば、投稿がドラフト状態の場合のみ削除するといった条件付きの削除を行うことができます。
1 2 |
const todelete = await DataStore.query(Post, "123"); DataStore.delete(todelete, post => post.status("eq", PostStatus.DRAFT)); |
また、あるモデルのすべてのアイテムを削除するには、Predicates.ALLを使うことができます。
1 |
await DataStore.delete(Post, Predicates.ALL); |
クエリ データ(Query Data)
クエリはローカルストアに対して行われます。クラウド同期を有効にすると、ローカルストアはDataStore Sync Engineによってバックグラウンドで更新されます。
オブジェクトの任意のフィールド値にマッチさせるなど、より高度なフィルタリングを行う場合は、クエリ述語を指定することができます。
1 |
const posts = await DataStore.query(Post); |
単一のアイテムを検索する場合
単一のアイテムを検索するには、クエリの第2引数にアイテムのIDを渡します。
1 |
const post = await DataStore.query(Post, "1234567"); |
プレディケート(Predicates)
プレディケートは、DataStore内のアイテムをマッチさせるために使用できるフィルターです。 query()に適用されると、返される結果を制約します。save()に適用されると、データを更新するための前提条件として機能します。
以下の述語を使って、スキーマ内のフィールドと照合することができます。
Strings:
eq | ne | le | lt | ge | gt | contains | notContains | beginsWith | between
Numbers: eq | ne | le | lt | ge | gt | between
Lists: contains | notContains
例えば、評価が4以上のすべてのPost Modelのリストが欲しいとします。
greater than 4:
1 |
const posts = await DataStore.query(Post, c => c.rating("gt", 4)); |
また、GraphQL Transformの条件文で定義されているような複数の条件を使用することもできます。例えば、評価が4以上で、公開されているすべての投稿を取得します。
greater than 4 and are PUBLISHED:
1 2 3 |
const posts = await DataStore.query(Post, c => c.rating("gt", 4).status("eq", PostStatus.PUBLISHED) ); |
また、or論理演算子を使用することもできます。
もし、これをor文にしたい場合は、c => c.or(…)のように組み合わせた述語を囲みます。
1 2 3 |
const posts = await DataStore.query(Post, c => c.or( c => c.rating("gt", 4).status("eq", PostStatus.PUBLISHED) )); |
ソート(整列)
Queryの結果は、1つまたは複数のフィールドでソートすることもできます。
例えば、すべてのPostオブジェクトをレーティングで昇順にソートする場合:
1 2 3 |
const posts = await DataStore.query(Post, Predicates.ALL, { sort: s => s.rating(SortDirection.ASCENDING) }); |
すべてのPostオブジェクトを、最初にレーティングで昇順に、次にタイトルで降順に並べ替える。
1 2 3 |
const posts = await DataStore.query(Post, Predicates.ALL, { sort: s => s.rating(SortDirection.ASCENDING).title(SortDirection.DESCENDING) }); |
ページネーション
Queryの結果は、ページ番号(0から始まる)とオプションの制限値(デフォルトは100)を渡すことで、ページ分割することもできます。これにより、最初の100個のアイテムのリストが返されます。
1 2 3 4 |
const posts = await DataStore.query(Post, Predicates.ALL, { page: 0, limit: 100 }); |
終わりに
今回の記事は以上になります。
次回は[第13回] Amplify & GraphQLでのデータモデル設計を学びましょう。
ご覧いただきありがとうございます。
コメント