AWS DynamoDB Data Mapper: условие запроса пропущено ключевой элемент схемы - PullRequest
0 голосов
/ 26 октября 2018

Я использую AWS DynamoDB Data Mapper в качестве высокоуровневого API для управления моей базой данных. Я пытаюсь запросить глобальный вторичный индекс, но не могу выйти за пределы этого исключения.

GSI основывается на запланированной дате окончания публикации в форме YYYY-MM-DD.

Когда я пытаюсь построить запрос следующим образом:

function getQueryPaginator( dataMapper: DataMapper, startKey: { [ key: string ]: any } ): QueryPaginator<Load> {
  const today: Date = new Date();
  const partitionKey: string = `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()}`;

  const queryOptions: QueryOptions = {
    indexName: 'PostingExpiryIndex',
    limit: 25
  };

  return dataMapper.query(
    Load,
    {
      partitionKey: partitionKey
    },
    queryOptions
  ).pages();
}

И используйте это:

const paginator: QueryPaginator<Load> = getQueryPaginator( dataMapper, lastEvaluatedKey );

    for await ( const page of paginator ) {
      try {
        const loadsBatch: Array<Load> = [];
        page.forEach( ( load: LoadInterface ) => {
          // do some logic...
          loadsBatch.push( Object.assign( new Load(), load ) );
        } );
        dataMapper.batchPut( loadsBatch );
      } catch ( e ) {
        log.error( `Error occurred while processing expired loads: ${e}` );
        await handleError( e );
      }
    }

Я получаю следующее исключение:

ValidationException: условие запроса пропущено ключевой элемент схемы в Request.extractError (/Users/myworkspace/node_modules/aws-sdk/lib/protocol/json.js:48:27)

Однако я могу запрашивать и получать значения, используя эквивалентный API-интерфейс клиента документов AWS:

var params = {
    TableName: 'loads',
    IndexName: 'PostingExpiryIndex', // optional (if querying an index)
    KeyConditionExpression: 'postingEndDate = :value', // a string representing a constraint on the attribute
    ExpressionAttributeValues: { // a map of substitutions for all attribute values
      ':value': '2018-10-26'
    }
};
docClient.query(params, function(err, data) {
    if (err) ppJson(err); // an error occurred
    else ppJson(data); // successful response
});
...