質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

GoでDynamoDBから条件に合ったitem(複数 or 単数)を取得したい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 734

score 7

解決したいこと

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を一つ取得しております。

// DB接続
    sess, err := session.NewSession()
    if err != nil {
        return events.APIGatewayProxyResponse{
            Body:       err.Error(),
            StatusCode: 500,
        }, err
    }

    db := dynamodb.New(sess)

    // 検索条件を用意
    getParam := &dynamodb.GetItemInput{
        TableName: aws.String("tablename"),
        Key: map[string]*dynamodb.AttributeValue{
            "user_id": {
                N: aws.String(pathparam),
            },
        },
    }

    // 検索
    result, err := db.GetItem(getParam)
    if err != nil {
        return events.APIGatewayProxyResponse{
            Body:       err.Error(),
            StatusCode: 404,
        }, err
    }

下記が全体のプログラムです。(補足)
APIGatewayに紐づけたLambda関数であり、APIGatewayのプロキシリクエストが来ると、DynamoDBのテーブルにアクセスして、itemを取得して返却するというものです。

package main

import (
    "encoding/json"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/dynamodb"
    "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
)

// Item DBに入れるデータ
type Item struct {
    UserID      int    `dynamodbav:"user_id" json:user_id`
    CreatedTime string `dynamodbav:"created_time" json:created_time`
}

// Response Lambdaが返答するデータ
type Response struct {
    RequestMethod string `json:RequestMethod`
    Result        Item   `json:Result`
}

func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    method := request.HTTPMethod
    pathparam := request.PathParameters["userid"]

    // DB接続
    sess, err := session.NewSession()
    if err != nil {
        return events.APIGatewayProxyResponse{
            Body:       err.Error(),
            StatusCode: 500,
        }, err
    }

    db := dynamodb.New(sess)

    // 検索条件を用意
    getParam := &dynamodb.GetItemInput{
        TableName: aws.String("tablename"),
        Key: map[string]*dynamodb.AttributeValue{
            "user_id": {
                N: aws.String(pathparam),
            },
        },
    }

    // 検索
    result, err := db.GetItem(getParam)
    if err != nil {
        return events.APIGatewayProxyResponse{
            Body:       err.Error(),
            StatusCode: 404,
        }, err
    }

    // 結果を構造体にパース
    item := Item{}
    err = dynamodbattribute.UnmarshalMap(result.Item, &item)
    if err != nil {
        return events.APIGatewayProxyResponse{
            Body:       err.Error(),
            StatusCode: 500,
        }, err
    }

    // httpレスポンス作成
    res := Response{
        RequestMethod: method,
        Result:        item,
    }
    jsonBytes, _ := json.Marshal(res)

    //返り値としてレスポンスを返す
    return events.APIGatewayProxyResponse{
        Body:       string(jsonBytes),
        StatusCode: 200,
    }, nil
}

func main() {
    lambda.Start(handler)
}

調べたこと

環境

  • 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
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る