使用二级索引的DynamoDB查询,如何使用不同的键进行查询
DynamoDB query using secondary index, how to query with different keys
我正在使用带 dynamodb 的无服务器框架 [在本地]。
尝试使用二级索引字段进行查询。
目标是像我们在 Mongo: {url:'<Somevalue>'}
中的基本查找查询中那样使用少量键进行查询,或者可能像这样 {url:<somevalue>,ha:<somevalue>}
Table 我目前使用的配置:
serverless.yml
resources:
Resources:
TableName:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: ${file(./serverless.js):Tables.TableName.name}
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: 'id'
AttributeType: 'S'
- AttributeName: 'url'
AttributeType: 'S'
- AttributeName: 'ha'
AttributeType: 'S'
- AttributeName: 'GSI_1_PK'
AttributeType: 'S'
- AttributeName: 'GSI_1_SK'
AttributeType: 'S'
KeySchema:
- AttributeName: 'id'
KeyType: 'HASH'
GlobalSecondaryIndexes:
- IndexName: 'GSI_1'
KeySchema:
- AttributeName: 'GSI_1_PK'
KeyType: 'HASH'
- AttributeName: 'GSI_1_SK'
KeyType: 'RANGE'
Projection:
ProjectionType: 'ALL'
- IndexName: 'URI_1'
KeySchema:
- AttributeName: 'url'
KeyType: 'HASH'
Projection:
ProjectionType: 'ALL'
- IndexName: 'HASH_1'
KeySchema:
- AttributeName: 'ha'
KeyType: 'HASH'
Projection:
ProjectionType: 'ALL'
Outputs:
TableNameARN:
Value: { 'Fn::GetAtt': [TableName, Arn] }
Export:
Name: ${file(./serverless.js):Exports.TableNameARN}
有了这个,目前我只能使用 id
字段进行搜索,
Q:
1> 查询不同字段需要做哪些改变? [这是二级索引,不在查询中使用 id
]
2> 如何使用多个属性进行搜索? [即:{url:<somevalue>,ha:<somevalue>}
]
我正在使用的查询:
var params = {
TableName: '<TableName>',
IndexName:'URI_1',
Key: {
url: 'http://something.com'
}
};
docClient.get(params, function(err, data) {
if (err) ppJson(err); // an error occurred
else ppJson(data); // successful response
});
查询输出:
{
message:"One of the required keys was not given a value",
code:"ValidationException,
...
}
- 您已经使用了允许您使用二级索引的 GSI。但是你应该使用
query
而不是 get
,它允许你查询任何 table 或具有复合主键(分区键和排序键)的二级索引。
- 只需使用
FilterExpression
和ExpressionAttributeValues
,它支持你使用多个条件。
var params = {
TableName: '<TableName>',
IndexName : 'URI_1',
KeyConditionExpression : 'url = :url',
FilterExpression : 'ha = :ha',
ExpressionAttributeValues : {
':url': 'http://something.com',
':ha': 'aaaa'
}
};
docClient.query(params, function(err, data) {
if (err) console.log(err); // an error occurred
else console.log(data); // successful response
});
额外
我们可以使用三个表达式来查询条件,前两个用于 Dynamodb.query
and the last one is used for Dynamodb.updateItem
or Dynamodb.putItem
:
- KeyConditionExpression - 需要在其中指定分区键 - 必需 - 或排序键。默认情况下它只能支持 table 键,如果你想使用像 GSI 这样的索引,你应该将它与 IndexName 一起使用.
- FilterExpression - 在查询完成后但在返回结果之前应用,并且 FilterExpression 不能包含分区键或排序键属性。
- ConditionExpression - 条件更新必须满足的条件。
我正在使用带 dynamodb 的无服务器框架 [在本地]。
尝试使用二级索引字段进行查询。
目标是像我们在 Mongo: {url:'<Somevalue>'}
中的基本查找查询中那样使用少量键进行查询,或者可能像这样 {url:<somevalue>,ha:<somevalue>}
Table 我目前使用的配置:
serverless.yml
resources:
Resources:
TableName:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: ${file(./serverless.js):Tables.TableName.name}
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: 'id'
AttributeType: 'S'
- AttributeName: 'url'
AttributeType: 'S'
- AttributeName: 'ha'
AttributeType: 'S'
- AttributeName: 'GSI_1_PK'
AttributeType: 'S'
- AttributeName: 'GSI_1_SK'
AttributeType: 'S'
KeySchema:
- AttributeName: 'id'
KeyType: 'HASH'
GlobalSecondaryIndexes:
- IndexName: 'GSI_1'
KeySchema:
- AttributeName: 'GSI_1_PK'
KeyType: 'HASH'
- AttributeName: 'GSI_1_SK'
KeyType: 'RANGE'
Projection:
ProjectionType: 'ALL'
- IndexName: 'URI_1'
KeySchema:
- AttributeName: 'url'
KeyType: 'HASH'
Projection:
ProjectionType: 'ALL'
- IndexName: 'HASH_1'
KeySchema:
- AttributeName: 'ha'
KeyType: 'HASH'
Projection:
ProjectionType: 'ALL'
Outputs:
TableNameARN:
Value: { 'Fn::GetAtt': [TableName, Arn] }
Export:
Name: ${file(./serverless.js):Exports.TableNameARN}
有了这个,目前我只能使用 id
字段进行搜索,
Q:
1> 查询不同字段需要做哪些改变? [这是二级索引,不在查询中使用 id
]
2> 如何使用多个属性进行搜索? [即:{url:<somevalue>,ha:<somevalue>}
]
我正在使用的查询:
var params = {
TableName: '<TableName>',
IndexName:'URI_1',
Key: {
url: 'http://something.com'
}
};
docClient.get(params, function(err, data) {
if (err) ppJson(err); // an error occurred
else ppJson(data); // successful response
});
查询输出:
{
message:"One of the required keys was not given a value",
code:"ValidationException,
...
}
- 您已经使用了允许您使用二级索引的 GSI。但是你应该使用
query
而不是get
,它允许你查询任何 table 或具有复合主键(分区键和排序键)的二级索引。 - 只需使用
FilterExpression
和ExpressionAttributeValues
,它支持你使用多个条件。
var params = {
TableName: '<TableName>',
IndexName : 'URI_1',
KeyConditionExpression : 'url = :url',
FilterExpression : 'ha = :ha',
ExpressionAttributeValues : {
':url': 'http://something.com',
':ha': 'aaaa'
}
};
docClient.query(params, function(err, data) {
if (err) console.log(err); // an error occurred
else console.log(data); // successful response
});
额外
我们可以使用三个表达式来查询条件,前两个用于 Dynamodb.query
and the last one is used for Dynamodb.updateItem
or Dynamodb.putItem
:
- KeyConditionExpression - 需要在其中指定分区键 - 必需 - 或排序键。默认情况下它只能支持 table 键,如果你想使用像 GSI 这样的索引,你应该将它与 IndexName 一起使用.
- FilterExpression - 在查询完成后但在返回结果之前应用,并且 FilterExpression 不能包含分区键或排序键属性。
- ConditionExpression - 条件更新必须满足的条件。