【问题标题】:How to query over range of range key of dynamodb?如何查询dynamodb的范围键范围?
【发布时间】:2017-10-01 08:20:21
【问题描述】:

我正在使用“aws-sdk”、“~> 2.6.44”。我有一个activities 表,用于存储用户执行的所有活动。

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'
            }
        ],....

我想查询此表,其中包含用户在过去 1 天内执行的所有活动。看起来AWS documentation site 有 SDK 版本 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

我尝试了过滤表达式:

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

使用范围键的范围选项查询 DynamoDB 表的正确方法应该是什么?

【问题讨论】:

    标签: ruby-on-rails nosql amazon-dynamodb aws-sdk aws-sdk-ruby


    【解决方案1】:

    如果我不尝试检索特定记录,我应该使用 query

    以下查询有效:

    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> 
    

    :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      相关资源
      最近更新 更多