はじめに
岡崎です。 今回は、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年に入社した新卒。ドラムとインコが好きな人。
最近は、デザイン駆動設計や関数型プログラミングに興味あり。
マネジメントも覚えていきたい系エンジニア。