Должен ли я использовать сканирование или запрос? - PullRequest
0 голосов
/ 28 августа 2018

Мне трудно в DynamoDB с выбором группы записей между двумя датами. Мои даты являются строками и отформатированы просто как "2018-01-01".

Должен ли я использовать запрос или сканирование? Мои параметры выглядят хорошо? Кажется, операция работает, но я не получаю никаких результатов. Что я делаю не так?

Вот мой код:

// get transactions for {month} and {year}
api.get('/transaction/tab/{year}/{month}', (request) => {
  const year = request.pathParams.year
  const month = request.pathParams.month
  const params = {
    TableName: request.env.tableName,
    KeyConditionExpression: '#date between :val1 and :val2',
    ExpressionAttributeNames: {
      '#date': 'date'
    },
    ExpressionAttributeValues: {
      ':val1': {
        S: year +'-' + month + '-01'
      },
      ':val2': {
        S: year + '-' + month + '-' + getDaysInMonth(month, year)
      }
    }
  }
console.log(params)
  // post-process dynamo result before returning
  dynamoDb.query(params, (err, data) => {
    console.log(data)
    if (err) {
      console.error('Unable to query. Error:', JSON.stringify(err, null, 2))
      return 'Unable to query. Error: '+ JSON.stringify(err, null, 2)
    } else {
      console.log('Query succeeded.')
      data.Items.forEach((item) => {
        console.log(' -', item.year + ': ' + item.title)
      })
      return data.Items
    }
  })
})

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Когда вы используете KeyConditionExpression выражение, которое означает, что вы используете Query на GSI.

Если date - это ключ раздела, а не ключ сортировки. Тогда у вас есть проблема:

Вы не определяете IndexName в своих параметрах.

В операции Query нельзя выполнить сравнительный тест (<,>, BETWEEN, ...) для ключа раздела. Условие должно выполнить проверку на равенство (=) для одного значения ключа секции и, необязательно, один из нескольких сравнительных тестов для одного значения ключа сортировки.

Например:

KeyConditionExpression: 'HashKey = :hkey and RangeKey > :rkey'

Вы хотите получать transactions месяца? Я думаю, вам нужно создать GSI с: year-month - это PrimaryKey (например: 2018-01, 2018-02), day-createdAt - это SortedKey (например: 28-1535429111358, ...)

Запрос будет похож на выше:

const params = {
    TableName: request.env.tableName,
    IndexName: 'MONTH-DAY-IDX',
    KeyConditionExpression: 'year-month = :val1',
    ExpressionAttributeValues: {
      ':val1': {
        S: year +'-' + month
      },
    }
  }
0 голосов
/ 28 августа 2018

DynamoDB не поддерживает изначально date/time тип. Поэтому я бы предложил хранить дату как UTC Number, она же Unix epoch time и использовать Query, поскольку она намного лучше, чем Scan

Просмотрите следующую статью, чтобы узнать, как преобразовать метки времени в Unix:

https://coderwall.com/p/rbfl6g/how-to-get-the-correct-unix-timestamp-from-any-date-in-javascript

...