2016-09-03 18 views
0

AWS DynamoDBテーブルをスキャンして特定の値だけを取得します。ここに私のコードは次のとおりです。ネストされたマップ値を取得する方法

package main 

import (
    "fmt" 

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

func main() { 
    svc := dynamodb.New(session.New(), &aws.Config{Region: aws.String("us-west-2")}) 

    params := &dynamodb.ScanInput{ 
     TableName: aws.String("my_Dynamo_table_name"), 
     Limit: aws.Int64(2), 
    } 

    resp, err := svc.Scan(params) 
    if err != nil { 
     fmt.Println(err.Error()) 
     return 
    } 

    fmt.Println(resp) 
} 

と出力されます:

{ 
    Count: 2, 
    Items: [{ 
     update_time: { 
     N: "1466495096" 
     }, 
     create_time: { 
     N: "1465655549" 
     } 
    },{ 
     update_time: { 
     N: "1466503947" 
     }, 
     create_time: { 
     N: "1466503947" 
     } 
    }], 
    LastEvaluatedKey: { 
    Prim_key: { 
     S: "1234567890" 
    } 
    }, 
    ScannedCount: 2 
} 

、私は上記の出力のすべての要素についてupdate_time値を取得します。ここに私の試みは、以下のとおりです。

for _, value := range resp.Items { 
    fmt.Println(value["create_time"]["N"]) 
} 

for _, value := range resp.Items { 
    fmt.Println(value.create_time.N) 
} 

for _, value := range resp.Items { 
    fmt.Println(*value.create_time.N) 
} 

上記のすべての試みが/var/tmp/dynamo.go:37: invalid operation:エラーでアウトエラー。 私はperl/pythonの背景にあり、最近golangを学び始めました。

この場合、ネストマップ/アレイ値を取得する方法。また、あらゆる参考文献は大きな助けになるでしょう。私のGoogle検索では関連性のあるものは明らかにされませんでした。

答えて

1

上記のrespの値は、*ScanOutputのタイプであり、Itemsタイプを[]map[string]*AttributeValueとしています。 update_timeにアクセスするには

、あなたが試すことができます:

updateTimes := make([]string, 0) 

// Items is a slice of map of type map[string]*AttributeValue 
for _, m := range resp.Items { 
    // m is of type map[string]*AttributeValue 
    timeStrPtr := *m["update_time"].N 
    updateTimes = append(updateTimes, *timeStrPtr) 
} 

updateTimesは今文字列としてすべての"update_time"値が含まれていなければなりません。

詳細here

+1

私はあなた 'for'ループを少し編集しました。入力いただきありがとうございます。私はpython/ruby​​で正確に同様のコードを実行し、 'resp'は標準のpython辞書/ ruby​​ハッシュです。したがって、値を取得するのは簡単でした。私は行っても、応答は地図であると思ったので、私はそれを働かせることができませんでした。そしてdocリンクのおかげで。 – slayedbylucifer

0

dynamodbattributeパッケージを使用する必要があります。それはより安く、より安全で、より読みやすくなります。

あなたの例を次に示します。

type Row struct { 
    CreateTime int `dynamodbav:"create_time"` 
    UpdateTime int `dynamodbav:"update_time"` 
} 

// ... 
rows := make([]*Row, len(resp.Items)) 
if err := dynamodbattribute.Unmarshal(resp.Items, &rows); err != nil { 
    // handle the error  
} 

// access the data 
for _, row := range rows { 
    fmt.Println(row.CreateTime, row.UpdateTime)  
} 
関連する問題