DynamoDBは初めてです。DeviceIDをハッシュキー、Timestampを範囲キー、およびいくつかのデータとして使用するテーブルを作成したいと思います。
{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }
SQLでは、タイムスタンプに日時型を使用できますが、DynamoDBでは使用できません。
DynamoDBは初めてです。DeviceIDをハッシュキー、Timestampを範囲キー、およびいくつかのデータとして使用するテーブルを作成したいと思います。
{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }
SQLでは、タイムスタンプに日時型を使用できますが、DynamoDBでは使用できません。
回答:
Stringデータ型は、日付またはタイムスタンプのために使用すべきです。
Stringデータ型を使用して、日付またはタイムスタンプを表すことができます。これを行う1つの方法は、次の例に示すように、ISO8601文字列を使用することです。
2016-02-15
2015-12-21T17:42:34Z
20150311T122706Z
はい、日付が文字列として保存されている場合、範囲クエリがサポートされます。BETWEEN FilterExpresssion上で使用することができます。以下のフィルター式を使用して、結果の項目を取得しました。
時間のないFilterExpression:-
FilterExpression : 'createdate between :val1 and :val2',
ExpressionAttributeValues : {
':hkey' : year_val,
':rkey' : title,
":val1" : "2010-01-01",
":val2" : "2010-12-31"
}
時間のあるFilterExpression:-
FilterExpression : 'createdate between :val1 and :val2',
ExpressionAttributeValues : {
':hkey' : year_val,
':rkey' : title,
":val1" : "2010-01-01T00:00:00",
":val2" : "2010-12-31T00:00:00"
}
データベース値:-
形式1-タイムゾーン付き:
{"Item":{"createdate":{"S":"2010-12-21T17:42:34+00:00"},"title":{"S":"The Big New Movie 2010"},"yearkey":{"N":"2010"},"info":{"M":{"rating":{"N":"0"},"plot":{"S":"Nothing happens at all."}}}}}
形式2-タイムゾーンなし:-
{"Item":{"createdate":{"S":"2010-12-21T17:42:34Z"},"title":{"S":"The Big New Movie 2010"},"yearkey":{"N":"2010"},"info":{"M":{"rating":{"N":"0"},"plot":{"S":"Nothing happens at all."}}}}}
データ型は要件によって異なります。
ISO形式を使用した文字列またはエポック形式を使用した数値を使用できます。
ISO形式(文字列)の利点は人間が読みやすいことですが、DynamoDBはこの形式の存続可能時間(TTL)をサポートしていません。notionquestで説明されているように、すべてのフィルターは「between」と「range」などで機能します。
DynamoDBの存続時間(TTL)を使用すると、テーブル内のアイテムの有効期限を定義して、データベースから自動的に削除できるようにすることができます。
エポック形式(数値)を使用する利点は、TTL機能とすべてのフィルターを使用できることです。
TLDR;
エポック形式(数値型)-存続可能時間
ISO形式(文字列型)を使用できます-存続可能時間は使用できませんが、より人間が読める形式です
数値データ型または文字列データ型
日付またはタイムスタンプに使用できます-この質問の承認された回答が数値を無視しているときに誤って選択されるため、文字列だけではありません。
数値データ型を使用して、日付またはタイムスタンプを表すことができます。これを行う1つの方法は、エポック時間(1970年1月1日の00:00:00 UTCからの秒数)を使用することです。たとえば、エポック時間1437136300は、2015年7月17日の12:31:40 PMUTCを表します。
詳細については、http://en.wikipedia.org/wiki/Unix_timeを参照してください。
..。
Stringデータ型を使用して、日付またはタイムスタンプを表すことができます。これを行う1つの方法は、次の例に示すように、ISO8601文字列を使用することです。
2016-02-15
2015-12-21T17:42:34Z
20150311T122706Z
詳細については、http://en.wikipedia.org/wiki/ISO_8601を参照してください。
クエリリクエストを送信するときに結果を除外できるようにするために、DateTimeにエポック形式を使用しました。文字列を使用するよりも効率的です。
これらのシナリオを想像してみてください:過去31日間、過去24時間、...ここでもbegins_with演算子(AWSドキュメントの以下のリンクの3番目の例を確認してください)があるため、文字列形式を使用してすべてが可能ですが、数値ははるかに効率的ですソート(比較)および計算中のパフォーマンスの評価。
日時をエポック形式に変換するのは簡単です
Javascript:
var date = new Date();
var epoch = date.getTime();
// converting back to date-time
var initial_date = new Date(epoch);
C#
var date = DateTime.UtcNow;
var epoch = new DateTimeOffset(date).ToUnixTimeSeconds();
// converting back to date-time
var initial_date = DateTimeOffset.FromUnixTimeSeconds(epoch);
Python
import time
epoch = time.time()
# converting back to date-time
initial_date = time.gmtime(epoch )