1

我正在使用带有 dynamodb [在本地] 的无服务器框架。尝试使用二级索引字段进行查询。目标是像我们在 Mongo 中的基本查找查询中那样使用很少的键进行查询:{url:'<Somevalue>'}或者可能是这样{url:<somevalue>,ha:<somevalue>}

我目前使用的表配置:

无服务器.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字段搜索,

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,
...
}
4

1 回答 1

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

额外的

我们可以使用三个表达式来查询条件,前两个用于 for Dynamodb.query,最后一个用于Dynamodb.updateItemor Dynamodb.putItem

  • KeyConditionExpression - 你需要指定分区键 - 需要 - 或排序键。它默认只能支持表键,如果你想使用像 GSI 这样的索引,你应该使用它与 IndexName。
  • FilterExpression - 在 Query 完成后应用,但在返回结果之前,FilterExpression 不能包含分区键或排序键属性。
  • ConditionExpression - 条件更新成功必须满足的条件。
于 2019-02-02T07:04:08.653 回答