田舎の技術者が奮闘中

php ruby node.js javascript などのスクリプト言語とサーバー(Chef、Vagrant)に関して書きます。

DynamoDBのorder byに関して

前回の記事でDynamoDBはorder byは出来ないと思っていたのですが、簡単な奴だったらできるみたいです。
order byできる条件として、、、

  1. hashとrangeキーが設定されていること。
  2. rangeキーを元にソートする。
  3. queryだけの場合のみ使える。(scanでは使用できない。)

以下がサンプルプログラムです。

DynamoDBテーブル構成

hash_key range_key
mori 2002-01
yoshida 2002-11
suzuki 1999-01
suzuki 2000-09
suzuki 2001-02
suzuki 2008-06
suzuki 2009-01
tanaka 2001-01
tanaka 2001-10

プログラム

require 'aws-sdk'
require 'pp'

dynamo_db = AWS::DynamoDB.new(
                              :access_key_id => '*****',
                              :secret_access_key => '*****',
                              :dynamo_db_endpoint => 'dynamodb.ap-northeast-1.amazonaws.com'
                              )

table = dynamo_db.tables["test"]

table.hash_key = [:name, :string]
table.range_key = [:date, :string]

table.items.query(:hash_value => "suzuki", :scan_index_forward => true).each {|i|
  pp i.attributes["date"]
}

結果

"1999-01"
"2000-09"
"2001-02"
"2008-06"
"2009-01"

「scan_index_forward => true」をfalseにすると逆になります。

"2009-01"
"2008-06"
"2001-02"
"2000-09"
"1999-01"

まとめ

かなり制限されていますが、使用することは可能です。
DynamoDBはイケイケで使うよりは、ちゃんと設計してから構築したほうが良いです。
rangeキーが3つぐらい設定出来ればいいのに・・・