Ruby Dynamodb:使用二级索引查询表
我正在使用gem查询一个表,该表如下所示:Ruby Dynamodb:使用二级索引查询表,ruby,amazon-web-services,amazon-dynamodb,Ruby,Amazon Web Services,Amazon Dynamodb,我正在使用gem查询一个表,该表如下所示: hk (Hashkey) | guid(Rangekey) | Timestamp (Secondary Range index) | other attributes aaaa | 50 | 2013-02-04T12:33:00Z | aaaa | 244 | 2013-04-22T04:54:00Z
hk (Hashkey) | guid(Rangekey) | Timestamp (Secondary Range index) | other attributes
aaaa | 50 | 2013-02-04T12:33:00Z |
aaaa | 244 | 2013-04-22T04:54:00Z |
aaaa | 342 | 2013-05-18T06:52:00Z |
bbbb | 243 | 2013-06-21T13:17:00Z |
我想做的是获取在某个日期之后创建的所有“aaaa”行。
例:
当我运行上面的代码时,我得到以下结果:
Query condition missed key schema element guid (AWS::DynamoDB::Errors::ValidationException)
使用hashKey和RangeKey运行查询是可行的,但是当我用辅助范围索引替换RangeKey时,它无法告诉我需要RangeKey
如果然后添加范围键(这没有意义),则会出现以下错误:
Conditions can be of length 1 or 2 only (AWS::DynamoDB::Errors::ValidationException)
有人知道会发生什么吗?您不是在查询辅助索引,而是在查询主索引(散列和范围键)。 要在DynamoDB中使用辅助索引,必须使用API的V2并在查询操作中指定索引
client = AWS::DynamoDB::Client.new(api_version: '2012-08-10')
client.query( { :table_name: 'table', :index_name: "timestamp-index", :select: 'ALL_PROJECTED_ATTRIBUTES', :key_conditions: {
'hk' => {
:comparison_operator: 'EQ',
:attribute_value_list: [
{'s' => 'aaaa'}
]
},
'timestamp' => {
:comparison_operator: 'GE',
:attribute_value_list: [
{'s' => Time.now.utc.iso8601}
]
} } })
您可以使用“扫描”代替“查询”
我可以强调的是,扫描速度比查询速度慢,对于检索大量数据,不建议进行扫描
我在下一个模式中这样做了
哪里
主分区密钥id(字符串)
我希望能帮助你
注意。
AWS::DynamoDB::ClientV2
已弃用。您应该使用:AWS::DynamoDB::Client.new(api_version:'2012-08-10')
是否可以使用多个索引查询表?此时,您只能使用一个索引查询表。SDK的v2版本使用AWS::DynamoDB::Client.new
,而不是AWS::DynamoDB…
请参阅本文
client = AWS::DynamoDB::Client.new(api_version: '2012-08-10')
client.query( { :table_name: 'table', :index_name: "timestamp-index", :select: 'ALL_PROJECTED_ATTRIBUTES', :key_conditions: {
'hk' => {
:comparison_operator: 'EQ',
:attribute_value_list: [
{'s' => 'aaaa'}
]
},
'timestamp' => {
:comparison_operator: 'GE',
:attribute_value_list: [
{'s' => Time.now.utc.iso8601}
]
} } })
//JavaScript EXAMPLE-1
var params = {
TableName : 'users',
FilterExpression : 'isActive = :isActive',
ExpressionAttributeValues : {':isActive' : true}
};
dynamoDBClient.scan(params, function(err, data){
if(err){
return console.error(err);
}
console.log(data.Items);
});