采用二次指数D​​ynamoDB查询,如何与不同的键查询

时间:2019-02-02 06:27:52

标签: amazon-dynamodb serverless-framework dynamodb-queries dynamo-local amazon-dynamodb-index

我在[本地]使用带有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,
...
}

1 个答案:

答案 0 :(得分:1)

  • 您已经使用了GSI,它允许您使用二级索引。但是您应该使用query而不是get,它允许您查询具有复合主键(分区键和排序键)的任何表或二级索引。
  • 只需使用FilterExpressionExpressionAttributeValues,它支持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.updateItemDynamodb.putItem

  • KeyConditionExpression-需要在其中指定分区键-必需-或在其中排序。默认情况下,它仅支持表键,如果要使用GSI之类的索引,则应将其与IndexName一起使用。
  • FilterExpression-在查询完成之后但在返回结果之前应用,并且FilterExpression不能包含分区键或排序键属性。
  • ConditionExpression-为了成功进行条件更新必须满足的条件。