Запрос DynamoDB с использованием вторичного индекса, как сделать запрос с разными ключами - PullRequest
0 голосов
/ 02 февраля 2019

Я использую безсерверный фреймворк с dynamicodb [in Local].пытаясь сделать запрос со вторичными индексированными полями.Цель состоит в том, чтобы выполнить запрос с помощью нескольких ключей, как мы делаем в базовых запросах поиска в Mongo: {url:'<Somevalue>'} или может быть таким {url:<somevalue>,ha:<somevalue>}

Конфигурация таблицы, которую я использую в настоящее время:

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 голосов
/ 02 февраля 2019
  • Вы уже использовали GSI, который позволяет вам использовать вторичные индексы.Но вы должны использовать query вместо get, это позволяет вам запрашивать любую таблицу или вторичный индекс, который имеет составной первичный ключ (ключ секции и ключ сортировки).
  • Просто используйте FilterExpressionExpressionAttributeValues поддерживает несколько условий.

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:

  • KeyConditionExpression - где необходимо указать ключ раздела- обязательно - или сортировать ключ. Он может поддерживать только ключ таблицы по умолчанию, если вы хотите использовать индексы, такие как GSI, вы должны использовать его с IndexName.
  • FilterExpression - применяется после завершения запроса, но дорезультаты возвращаются, и FilterExpression не может содержать атрибуты ключа раздела или ключа сортировки.
  • ConditionExpression - условие, которое должно быть выполнено для успешного выполнения условного обновления.
...