我在[本地]使用带有dynamodb的无服务器框架。
尝试查询二级索引字段。
目标是使用很少的键进行查询,就像在Mongo中的基本查找查询中一样:{url:'<Somevalue>'}
或可能像这样的{url:<somevalue>,ha:<somevalue>}
表CONFIG我使用目前:
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,
...
}
答案 0 :(得分:1)
query
而不是get
,它允许您查询具有复合主键(分区键和排序键)的任何表或二级索引。FilterExpression
和ExpressionAttributeValues
,它支持u使用多个条件。
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
,最后一个用于Dynamodb.updateItem
或Dynamodb.putItem
: