DynamoDBでインデックスまたはクエリーを実行した取得結果(いわゆる検索結果件)について、2つのパラメーターが返却される。

  • ScannedCount
  • Count

初めてDynamoDB触る人は、「検索結果件数が2つあるけど何なの?」「総件数より少ない気がする」と感じるはずなので、解説しておく。

ScannedCount

その名の通り、スキャンした件数である。DynamoDBは一度のクエリー(スキャン)で 1 MB までしかItemを取得できない。

1MB以上のデータがある場合は、NextTokenというカーソルトークン(検索結果の位置のインデックス)と共に、1MBまでのItemを返すようになっている。

Itemを取得する際、どのフィールドを取得指定したのかで、データ量が変わるので一概に1MB=1000件という表現はできない。(不要なデータを取得しオーバーヘッドになっている場合は無論取得できるItem数が減少してくる)

ちなみにこのカーソルトークンという仕組みは、お馴染みのElasticSearchでも採用されているので是非慣れておいた方が良い。

Count

検索結果として返却した件数になる。

例)

  • Userテーブル(1000件)
  • 年齢20歳未満のユーザーは200件
  • 年齢フィールドにはインデックスは貼られていない
  • クエリースキャンに20歳未満を指定
{
  ScannedCount : 1,000,
  Count : 200 
}

Gmailも総件数とっていません、NoSQLで真面目に総件数を取得するのは諦めましょう

総件数をちゃんと取得するのは、DynamoDBでは諦めましょう。
GoogleのGmailなどを見てもちゃんと取得していないですし。(確かに結果の全件数が知りたいなんてユーザーってあまりいないですよね、BIツールじゃありませんし)

どうしても欲しいのなら、ElasticSearchの導入を推奨しますー。