この記事は最終更新日から1年以上が経過しています。
はじめに
岡崎です。
今回は、DynamoDBのscanについて書いていきます。
使用する言語
- PHP 5.6.12
使用するSDK
- https://github.com/aws/aws-sdk-php.git (ver 3.28.2)
いきなり結論
- 上記のPHP SDKを使用してDynamoデータの中身を全てScanして検索結果を取得したい場合は
下記のようにすればOKです。
/** * 検索条件を元にDynamoDBのテーブル内を全検索を行う * @param $conditions(検索条件) * @return Array */ public function getFullScanResult($conditions) { while (true) { $result = $dynamodb->scan($conditions); $dataFromDynamo = []; if (!empty($result['Items'])) { $dataFromDynamo[] = $result; } if (isset($result['LastEvaluatedKey'])) { $conditions['ExclusiveStartKey'] = $result['LastEvaluatedKey']; } else { break; } } return $dataFromDynamo; } |
なぜこの結論なのか?(概要)
このSDKを使用したDynamoDBのScanは、イメージでいうとページャーです。
ページが複数あるうちの1ページ目の項目しか検索してくれない感じのものなので、
全部の項目を見に行きたい場合は、自分でループを回す必要があります。
なぜこの結論なのか??(詳細)
以下、ページを例に出しながら照らしあわせて解説します。
-
1ページ目で検索した結果が何もない場合は、Itemsの中が空でレスポンスとして返却されます。
-
検索結果がある場合は、Itemsの中にDynamoDBからの情報が入ることになります。
- ページが他にも存在する場合(2ページ目, 3ページ目…)は、レスポンスの中のLastEvaluatedKey
のValueに以下のような値が入ってきます。
LastEvaluatedKey: Array ( [id] => Array ( [N] => 724 ) ) |
- 逆に他にもう検索項目が無い場合(全ての項目をscanした場合)は、レスポンスにLastEvaluatedKeyが返却されません。
- ページが他にも存在する場合で次のページを検索したい場合は、検索条件にExclusiveStartKeyにLastEvaluatedKeyを指定することでoffsetを変更することができます。(前回の検索範囲を除いた部分から検索を開始します。ということを明示的に書くことができます。)
この記事を書いた人
-
2016年に入社した新卒。ドラムとインコが好きな人。
最近は、デザイン駆動設計や関数型プログラミングに興味あり。
マネジメントも覚えていきたい系エンジニア。
最近書いた記事
- 2018.12.02シリコンバレー1日ツアーに参加してきました(後半)
- 2018.11.29【re:Invent 2018】Day3 -いよいよ本命のKeynote!-
- 2018.11.27【re:Invent 2018】Day1 - re:Inventに参加してきました!!!
- 2018.02.21CloudFormationでAPIGatewayのリソースとメソッドを作成する方法