解決したいこと
DynamoDBから条件に合ったitem(複数 or 単数)を取得したいです。
やりたいこととしては、下記のようなDynamoDBのテーブルから前日に作成されたitemを取得して、その個数を返却したいです。
例えば、この処理を実行する日が5/8日だとすると、5/7に作成されたitemの個数を返却したいということになります。
userid | created_time | deleted_time |
---|---|---|
1 | 2021-05-01T02:45:35.483864Z | 2021-05-08T02:45:35.483864Z |
2 | 2021-05-02T02:45:35.483864Z | 2021-05-08T02:45:35.483864Z |
3 | 2021-05-07T02:45:35.483864Z | 2021-05-08T02:45:35.483864Z |
4 | 2021-05-07T04:48:15.483864Z | 2021-05-08T02:45:35.483864Z |
... | ... | ... |
当方、GoやAWSを触り始めたばかりの初心者で知識不足のため、わかりやすく説明していただけると幸いです。
どんな方法があるのか列挙していただいたり、指針を示していただけるだけでありがたいです。
よろしくお願い致します。
現状の下記のコードでは、DBに接続して、getItem()によって指定したテーブル、user_idのitemを一つ取得しております。
Go
1// DB接続 2 sess, err := session.NewSession() 3 if err != nil { 4 return events.APIGatewayProxyResponse{ 5 Body: err.Error(), 6 StatusCode: 500, 7 }, err 8 } 9 10 db := dynamodb.New(sess) 11 12 // 検索条件を用意 13 getParam := &dynamodb.GetItemInput{ 14 TableName: aws.String("tablename"), 15 Key: map[string]*dynamodb.AttributeValue{ 16 "user_id": { 17 N: aws.String(pathparam), 18 }, 19 }, 20 } 21 22 // 検索 23 result, err := db.GetItem(getParam) 24 if err != nil { 25 return events.APIGatewayProxyResponse{ 26 Body: err.Error(), 27 StatusCode: 404, 28 }, err 29 }
下記が全体のプログラムです。(補足)
APIGatewayに紐づけたLambda関数であり、APIGatewayのプロキシリクエストが来ると、DynamoDBのテーブルにアクセスして、itemを取得して返却するというものです。
Go
1package main 2 3import ( 4 "encoding/json" 5 6 "github.com/aws/aws-lambda-go/events" 7 "github.com/aws/aws-lambda-go/lambda" 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/aws/session" 10 "github.com/aws/aws-sdk-go/service/dynamodb" 11 "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute" 12) 13 14// Item DBに入れるデータ 15type Item struct { 16 UserID int `dynamodbav:"user_id" json:user_id` 17 CreatedTime string `dynamodbav:"created_time" json:created_time` 18} 19 20// Response Lambdaが返答するデータ 21type Response struct { 22 RequestMethod string `json:RequestMethod` 23 Result Item `json:Result` 24} 25 26func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { 27 method := request.HTTPMethod 28 pathparam := request.PathParameters["userid"] 29 30 // DB接続 31 sess, err := session.NewSession() 32 if err != nil { 33 return events.APIGatewayProxyResponse{ 34 Body: err.Error(), 35 StatusCode: 500, 36 }, err 37 } 38 39 db := dynamodb.New(sess) 40 41 // 検索条件を用意 42 getParam := &dynamodb.GetItemInput{ 43 TableName: aws.String("tablename"), 44 Key: map[string]*dynamodb.AttributeValue{ 45 "user_id": { 46 N: aws.String(pathparam), 47 }, 48 }, 49 } 50 51 // 検索 52 result, err := db.GetItem(getParam) 53 if err != nil { 54 return events.APIGatewayProxyResponse{ 55 Body: err.Error(), 56 StatusCode: 404, 57 }, err 58 } 59 60 // 結果を構造体にパース 61 item := Item{} 62 err = dynamodbattribute.UnmarshalMap(result.Item, &item) 63 if err != nil { 64 return events.APIGatewayProxyResponse{ 65 Body: err.Error(), 66 StatusCode: 500, 67 }, err 68 } 69 70 // httpレスポンス作成 71 res := Response{ 72 RequestMethod: method, 73 Result: item, 74 } 75 jsonBytes, _ := json.Marshal(res) 76 77 //返り値としてレスポンスを返す 78 return events.APIGatewayProxyResponse{ 79 Body: string(jsonBytes), 80 StatusCode: 200, 81 }, nil 82} 83 84func main() { 85 lambda.Start(handler) 86}
調べたこと
- 下記サイトにて、TransactGetItems()やBatchGetItem()で複数のitemを取得できそうであることは調べましたが、いまいち使い方がわかりませんでした。
https://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/#DynamoDB.TransactGetItems
環境
- VsCode Version: 1.56.0
- Mac M1
- Delve Debugger Version: 1.6.0
- Go version: go1.16.3 darwin/arm64
- AWS CLI version aws-cli/2.2.0 Python/3.9.4 Darwin/20.3.0 source/arm64 prompt/off
あなたの回答
tips
プレビュー