0

I'm using 'aws-sdk', '~> 2.6.44'. I've an activities table where I store all the activities performed by a user.

params = {
        table_name: 'activities', # required
        key_schema: [ # required
            {
                attribute_name: 'actor', # required User.1
                key_type: 'HASH', # required, accepts HASH, RANGE
            },
            {
                attribute_name: 'created_at', # timestamp
                key_type: 'RANGE'
            }
        ],....

I want to query this table with all the activities performed by user in past 1 day. Looks like the AWS documentation site has the documentation for SDK version 3.

tableName = 'activities'
params = {
    table_name: tableName,
    key_condition_expression: "#user = :actor and #time between :start_time and :end_time",
    expression_attribute_names: {
        "#user" => 'actor',
        "#time" => "created_at"
    },
    expression_attribute_values: {
        actor: 'User.1',
        ":start_time" => (Time.now - 1.days).to_i,
        ":end_time" => (Time.now + 1.days).to_i
    }
}

DynamodbClient.client.get_item(params)
# Throws:  ArgumentError: no such member :key_condition_expression

I tried with filter expression:

tableName = 'activities'
params = {
    table_name: tableName,
    key: {
        actor: 'User.1'
    },
    filter_expression: "created_at BETWEEN (:id1, :id2)",
    expression_attribute_values: { ":id1" => (Time.now - 1.days).to_i,":id2" => (Time.now + 1.days).to_i},
    projection_expression: "actor"
}

DynamodbClient.client.get_item(params)

# Throws ArgumentError: no such member :filter_expression

What should be right way to query DynamoDB table with a ranged option for range key?

Indyarocks
  • 643
  • 1
  • 6
  • 26

1 Answers1

0

Looks like I should use query if I'm not trying to retrieve a specific record.

Following query worked:

tableName = 'activities'
params = {
    table_name: tableName,
    key_condition_expression: "#user = :actor and #time between :start_time and :end_time",
    expression_attribute_names: {
        "#user" => 'actor',
        "#time" => "created_at"
    },
    expression_attribute_values: {
        ":actor" => 'User.1',
        ":start_time" => (Time.now - 1.days).to_i,
        ":end_time" => (Time.now + 1.days).to_i
    }
}

DynamodbClient.client.query(params)

 => #<struct Aws::DynamoDB::Types::QueryOutput items=[{"actor"=>"User.1", "action"=>"Like", "created_at"=>#<BigDecimal:7fa6418b86e0,'0.150683976E10',18(27)>, "source"=>"FeedSource.661", "body"=>{"id"=>#<BigDecimal:7fa6418b82f8,'0.72E2',9(18)>}, "target"=>"FeedEntry.8419"}], count=1, scanned_count=1, last_evaluated_key=nil, consumed_capacity=nil> 

:)

Indyarocks
  • 643
  • 1
  • 6
  • 26