C#에서 DynamoDB에서 시계열 데이터를 GSI를 사용하여 범위 지정 및 검색
[사전 준비 1] 데이터
아래 구조의 데이터를 저장할 수 있도록,
[DynamoDBTable("SampleTable")]
public class Sample
{
    /// <summary>「SampleTable」テーブルのハッシュキー</summary>
    [DynamoDBHashKey]
    public string Id { get; set; }
    /// <summary>「SampleTable」テーブルのレンジキー</summary>
    [DynamoDBRangeKey]
    public string DateAndTime { get; set; }
    /// <summary>「Date-Time-index」GSI のハッシュキー</summary>
    [DynamoDBGlobalSecondaryIndexHashKey]
    public string Date { get; set; }
    /// <summary>「Date-Time-index」GSI のレンジキー</summary>
    [DynamoDBGlobalSecondaryIndexRangeKey]
    public string Time { get; set; }
    [DynamoDBProperty]
    public string Message { get; set; }
    public override string ToString()
    {
        return $"{Id} / {DateAndTime} / {Message}";
    }
}
AWS Console에서 Id , DateAndTime 를 키로 한 SampleTable 테이블을 준비합니다.
 
그런 다음 아래와 같이 SaveAsync 메서드를 사용하여 10개의 데이터를 만듭니다.
// DynamoDB にアクセスするためのオブジェクトを用意
using var client = new AmazonDynamoDBClient(RegionEndpoint.APNortheast1);
using var context = new DynamoDBContext(client);
// 10件のデータを作成
for (var i = 0; i < 10; i++)
{
    var now = DateTime.Now;
    await context.SaveAsync(new Sample
    {
        Id = $"{i % 3 + 1:D3}",
        DateAndTime = $"{now:yyyy-MM-dd HH:mm:ss.fff}",
        Date = $"{now:yyyy-MM-dd}",
        Time = $"{now:HH:mm:ss}",
        Message = $"メッセージ - {i + 1}"
    });
    // 保存される時間をずらしたいので 500 msec 待機
    await Task.Delay(500);
}
아래와 같이 ScanAsync 메소드를 사용해 모든 데이터를 취득합니다.
// 全データを取得
var listAll = await context.ScanAsync<Sample>(null).GetRemainingAsync();
Console.WriteLine("--- listAll");
listAll.OrderBy(n => n.DateAndTime).ToList().ForEach(Console.WriteLine);
그러면 아래와 같이 데이터를 얻을 수 있습니다.
--- listAll
001 / 2020-08-11 11:40:40.236 / メッセージ - 1
002 / 2020-08-11 11:40:41.224 / メッセージ - 2
003 / 2020-08-11 11:40:41.756 / メッセージ - 3
001 / 2020-08-11 11:40:42.293 / メッセージ - 4
002 / 2020-08-11 11:40:42.824 / メッセージ - 5
003 / 2020-08-11 11:40:43.355 / メッセージ - 6
001 / 2020-08-11 11:40:43.877 / メッセージ - 7
002 / 2020-08-11 11:40:44.412 / メッセージ - 8
003 / 2020-08-11 11:40:44.936 / メッセージ - 9
001 / 2020-08-11 11:40:45.458 / メッセージ - 10
 [사전 준비 2] GSI
AWS Console에서는 다음과 같이 데이터가 저장되어 있는지 확인할 수 있습니다.
 
사전 준비가 끝나면 AWS Console에서 Date , Time 를 키로 한 Date-Time-index 인덱스(GSI)를 준비하여 날짜 및 시간을 범위 지정하여 검색할 수 있습니다.
 
이것으로 준비가 완료됩니다.
 [시나리오 1] Id = 001의 데이터를 얻고 싶습니다.
아래와 같이 해시 키에 001 를 지정해 QueryAsync() 메소드를 사용해 데이터를 취득합니다.
var list01 = await context.QueryAsync<Sample>("001").GetRemainingAsync();
Console.WriteLine("--- list01");
list01.OrderBy(n => n.DateAndTime).ToList().ForEach(Console.WriteLine);
그러면 아래와 같이 데이터를 얻을 수 있습니다.
--- list01
001 / 2020-08-11 11:40:40.236 / メッセージ - 1
001 / 2020-08-11 11:40:42.293 / メッセージ - 4
001 / 2020-08-11 11:40:43.877 / メッセージ - 7
001 / 2020-08-11 11:40:45.458 / メッセージ - 10
Id가 001인 데이터만 검색할 수 있습니다.
 [시나리오 2] 2020-08-11 의 11:40:42~11:40:43 의 데이터를 취득하고 싶다
아래와 같이 GSI 의 이름 Date-Time-index 를 지정해, 해시 키에 2020-08-11 를 지정해, 레인지 키에는 QueryOperator.Between 와 11:40:42 - 11:40:43 를 지정해 QueryAsync() 메소드를 사용해 데이터를 취득 합니다.
var list02 = await context.QueryAsync<Sample>(
    "2020-08-11",
    QueryOperator.Between,
    new List<object>
    {
        "11:40:42",
        "11:40:43"
    },
    new DynamoDBOperationConfig
    {
        IndexName = "Date-Time-index" // 利用する GSI を指定
    }).GetRemainingAsync();
Console.WriteLine("--- list02");
list02.OrderBy(n => n.DateAndTime).ToList().ForEach(Console.WriteLine);
그러면 아래와 같이 데이터를 얻을 수 있습니다.
--- list02
001 / 2020-08-11 11:40:42.293 / メッセージ - 4
002 / 2020-08-11 11:40:42.824 / メッセージ - 5
003 / 2020-08-11 11:40:43.355 / メッセージ - 6
001 / 2020-08-11 11:40:43.877 / メッセージ - 7
SampleTable 테이블의 해시 키인 Id 를 넘어 11:40:42 - 11:40:43 의 데이터만을 취득할 수 있습니다.
 사이고에게
GSI를 사용하여 날짜와 시간을 범위 지정하여 검색할 수 있었습니다.
다만, 코스트면의 고려나 NoSQL다운 설계에 대해서는 할 수 있을까라고 하면,
더 좋은 방법이 있다면 알려주세요 m(_ _)m
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(C#에서 DynamoDB에서 시계열 데이터를 GSI를 사용하여 범위 지정 및 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/hyukix/items/cb4448f5d8c53bcd799e
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
[DynamoDBTable("SampleTable")]
public class Sample
{
    /// <summary>「SampleTable」テーブルのハッシュキー</summary>
    [DynamoDBHashKey]
    public string Id { get; set; }
    /// <summary>「SampleTable」テーブルのレンジキー</summary>
    [DynamoDBRangeKey]
    public string DateAndTime { get; set; }
    /// <summary>「Date-Time-index」GSI のハッシュキー</summary>
    [DynamoDBGlobalSecondaryIndexHashKey]
    public string Date { get; set; }
    /// <summary>「Date-Time-index」GSI のレンジキー</summary>
    [DynamoDBGlobalSecondaryIndexRangeKey]
    public string Time { get; set; }
    [DynamoDBProperty]
    public string Message { get; set; }
    public override string ToString()
    {
        return $"{Id} / {DateAndTime} / {Message}";
    }
}
// DynamoDB にアクセスするためのオブジェクトを用意
using var client = new AmazonDynamoDBClient(RegionEndpoint.APNortheast1);
using var context = new DynamoDBContext(client);
// 10件のデータを作成
for (var i = 0; i < 10; i++)
{
    var now = DateTime.Now;
    await context.SaveAsync(new Sample
    {
        Id = $"{i % 3 + 1:D3}",
        DateAndTime = $"{now:yyyy-MM-dd HH:mm:ss.fff}",
        Date = $"{now:yyyy-MM-dd}",
        Time = $"{now:HH:mm:ss}",
        Message = $"メッセージ - {i + 1}"
    });
    // 保存される時間をずらしたいので 500 msec 待機
    await Task.Delay(500);
}
// 全データを取得
var listAll = await context.ScanAsync<Sample>(null).GetRemainingAsync();
Console.WriteLine("--- listAll");
listAll.OrderBy(n => n.DateAndTime).ToList().ForEach(Console.WriteLine);
--- listAll
001 / 2020-08-11 11:40:40.236 / メッセージ - 1
002 / 2020-08-11 11:40:41.224 / メッセージ - 2
003 / 2020-08-11 11:40:41.756 / メッセージ - 3
001 / 2020-08-11 11:40:42.293 / メッセージ - 4
002 / 2020-08-11 11:40:42.824 / メッセージ - 5
003 / 2020-08-11 11:40:43.355 / メッセージ - 6
001 / 2020-08-11 11:40:43.877 / メッセージ - 7
002 / 2020-08-11 11:40:44.412 / メッセージ - 8
003 / 2020-08-11 11:40:44.936 / メッセージ - 9
001 / 2020-08-11 11:40:45.458 / メッセージ - 10
AWS Console에서는 다음과 같이 데이터가 저장되어 있는지 확인할 수 있습니다.

사전 준비가 끝나면 AWS Console에서
Date , Time 를 키로 한 Date-Time-index 인덱스(GSI)를 준비하여 날짜 및 시간을 범위 지정하여 검색할 수 있습니다.
이것으로 준비가 완료됩니다.
[시나리오 1] Id = 001의 데이터를 얻고 싶습니다.
아래와 같이 해시 키에 001 를 지정해 QueryAsync() 메소드를 사용해 데이터를 취득합니다.
var list01 = await context.QueryAsync<Sample>("001").GetRemainingAsync();
Console.WriteLine("--- list01");
list01.OrderBy(n => n.DateAndTime).ToList().ForEach(Console.WriteLine);
그러면 아래와 같이 데이터를 얻을 수 있습니다.
--- list01
001 / 2020-08-11 11:40:40.236 / メッセージ - 1
001 / 2020-08-11 11:40:42.293 / メッセージ - 4
001 / 2020-08-11 11:40:43.877 / メッセージ - 7
001 / 2020-08-11 11:40:45.458 / メッセージ - 10
Id가 001인 데이터만 검색할 수 있습니다.
 [시나리오 2] 2020-08-11 의 11:40:42~11:40:43 의 데이터를 취득하고 싶다
아래와 같이 GSI 의 이름 Date-Time-index 를 지정해, 해시 키에 2020-08-11 를 지정해, 레인지 키에는 QueryOperator.Between 와 11:40:42 - 11:40:43 를 지정해 QueryAsync() 메소드를 사용해 데이터를 취득 합니다.
var list02 = await context.QueryAsync<Sample>(
    "2020-08-11",
    QueryOperator.Between,
    new List<object>
    {
        "11:40:42",
        "11:40:43"
    },
    new DynamoDBOperationConfig
    {
        IndexName = "Date-Time-index" // 利用する GSI を指定
    }).GetRemainingAsync();
Console.WriteLine("--- list02");
list02.OrderBy(n => n.DateAndTime).ToList().ForEach(Console.WriteLine);
그러면 아래와 같이 데이터를 얻을 수 있습니다.
--- list02
001 / 2020-08-11 11:40:42.293 / メッセージ - 4
002 / 2020-08-11 11:40:42.824 / メッセージ - 5
003 / 2020-08-11 11:40:43.355 / メッセージ - 6
001 / 2020-08-11 11:40:43.877 / メッセージ - 7
SampleTable 테이블의 해시 키인 Id 를 넘어 11:40:42 - 11:40:43 의 데이터만을 취득할 수 있습니다.
 사이고에게
GSI를 사용하여 날짜와 시간을 범위 지정하여 검색할 수 있었습니다.
다만, 코스트면의 고려나 NoSQL다운 설계에 대해서는 할 수 있을까라고 하면,
더 좋은 방법이 있다면 알려주세요 m(_ _)m
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(C#에서 DynamoDB에서 시계열 데이터를 GSI를 사용하여 범위 지정 및 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/hyukix/items/cb4448f5d8c53bcd799e
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
var list01 = await context.QueryAsync<Sample>("001").GetRemainingAsync();
Console.WriteLine("--- list01");
list01.OrderBy(n => n.DateAndTime).ToList().ForEach(Console.WriteLine);
--- list01
001 / 2020-08-11 11:40:40.236 / メッセージ - 1
001 / 2020-08-11 11:40:42.293 / メッセージ - 4
001 / 2020-08-11 11:40:43.877 / メッセージ - 7
001 / 2020-08-11 11:40:45.458 / メッセージ - 10
아래와 같이 GSI 의 이름
Date-Time-index 를 지정해, 해시 키에 2020-08-11 를 지정해, 레인지 키에는 QueryOperator.Between 와 11:40:42 - 11:40:43 를 지정해 QueryAsync() 메소드를 사용해 데이터를 취득 합니다.var list02 = await context.QueryAsync<Sample>(
    "2020-08-11",
    QueryOperator.Between,
    new List<object>
    {
        "11:40:42",
        "11:40:43"
    },
    new DynamoDBOperationConfig
    {
        IndexName = "Date-Time-index" // 利用する GSI を指定
    }).GetRemainingAsync();
Console.WriteLine("--- list02");
list02.OrderBy(n => n.DateAndTime).ToList().ForEach(Console.WriteLine);
그러면 아래와 같이 데이터를 얻을 수 있습니다.
--- list02
001 / 2020-08-11 11:40:42.293 / メッセージ - 4
002 / 2020-08-11 11:40:42.824 / メッセージ - 5
003 / 2020-08-11 11:40:43.355 / メッセージ - 6
001 / 2020-08-11 11:40:43.877 / メッセージ - 7
SampleTable 테이블의 해시 키인 Id 를 넘어 11:40:42 - 11:40:43 의 데이터만을 취득할 수 있습니다.사이고에게
GSI를 사용하여 날짜와 시간을 범위 지정하여 검색할 수 있었습니다.
다만, 코스트면의 고려나 NoSQL다운 설계에 대해서는 할 수 있을까라고 하면,
더 좋은 방법이 있다면 알려주세요 m(_ _)m
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(C#에서 DynamoDB에서 시계열 데이터를 GSI를 사용하여 범위 지정 및 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/hyukix/items/cb4448f5d8c53bcd799e
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
Reference
이 문제에 관하여(C#에서 DynamoDB에서 시계열 데이터를 GSI를 사용하여 범위 지정 및 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hyukix/items/cb4448f5d8c53bcd799e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)