How to get data from aws Dynamodb with using partition key only?

28,894

Solution 1

You have to use Query or Scan operation, this is a simple example but you can read more on Amazon documentation here

In particular, Query operation

A Query operation finds items in a table or a secondary index using only primary key attribute values

var queryInput = &dynamodb.QueryInput{
    TableName: aws.String(dynamoRestDataTableName),
    KeyConditions: map[string]*dynamodb.Condition{
        "DeviceId": {
            ComparisonOperator: aws.String("EQ"),
            AttributeValueList: []*dynamodb.AttributeValue{
                {
                    S: aws.String("aDeviceId"),
                },
            },
        },
    },
}

var resp, err = dynamoSvc.Query(queryInput)
if err != nil {
    return nil, err
}

Solution 2

Query operation can be used in that case
Following is one generic example for the same

compositeKey := entity.GetPrimaryKey(inputVar)
expressionAttributeValues := map[string]*dynamodb.AttributeValue{
    ":v1": {
        S: aws.String(compositeKey.PartitionKey.Data.(string)),
    },
}
queryInput := dynamodb.QueryInput{
    TableName:                 &d.TableName,
    KeyConditionExpression:    aws.String("id = :v1"),
    ExpressionAttributeValues: expressionAttributeValues,
}
queryOutput, err := d.DdbSession.Query(&queryInput)
if err != nil {
    log.Error("error in fetching records ", err)
    return nil, err
}

// unmarshal the query output - items to interface

err = dynamodbattribute.UnmarshalListOfMaps(queryOutput.Items, &yourInterface)
Share:
28,894

Related videos on Youtube

mkral
Author by

mkral

Updated on May 11, 2022

Comments

  • mkral
    mkral almost 2 years

    I am using aws-sdk-go library for DynamoDb connectivity in Golang.

    My DynamoDb table have a Partition key DeviceId (String) and a Sort Key Time (Number). How can I write GetItemInput to get all data with a specific DeviceId?

    params := &dynamodb.GetItemInput{
    
        Key:    map[string]*dynamodb.AttributeValue {
            "DeviceId": {
                S: aws.String("item_1"),
            },
        },
        ExpressionAttributeNames: map[string]*string{
            "DeviceId": "DeviceId",
        },
        TableName:  aws.String("DbName"), 
    }
    
    list, err := svc.GetItem(params)
    
  • Admin
    Admin over 7 years
    Thanks Bro. Can you please tell me how to access data from the QueryOutput? Suppose if I want to access last entry in the queryoutput how can I do that?
  • Admin
    Admin over 7 years
    Is this the only way to do it? *resp.Items[*resp.Count - int64(1)]["attribute"].S
  • fIwJlxSzApHEZIl
    fIwJlxSzApHEZIl over 6 years
    This looks perfect Alessio except it should be S: aws.String("aDeviceId"),
  • fIwJlxSzApHEZIl
    fIwJlxSzApHEZIl over 6 years
    @user6681013 if we look in api.go we can see that the QueryOutput struct has the definition Items []map[string]*AttributeValue so the results are returned as an array of maps. each map represents one row of values and each key in the map represents one column name in the table.