目次

目次

【PHP】DynamoDBのScanのデフォルトが全件スキャンでない

アバター画像
岡崎拓哉
アバター画像
岡崎拓哉
最終更新日2017/08/01 投稿日2017/08/01

はじめに

岡崎です。 今回は、DynamoDBのscanについて書いていきます。

使用する言語

  • PHP 5.6.12

使用するSDK

いきなり結論

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

目次