Почему AWSDynamoDBScanExpression возвращается пустым при использовании ключа сортировки в качестве filterExpression? - PullRequest
0 голосов
/ 09 января 2019

У меня есть следующая таблица DynamoDB:

BoardId   |  DateTime          |  Data  |  Type
-------------------------------------------------
1         |  20180424T123508Z  |  68.1  |  U
1         |  20181026T143233Z  |  38.2  |  T
1         |  20190108T120150Z  |  38.1  |  T
2         |  20180425T092311Z  |  63.4  |  U

"BoardId" - это ключ , а "DateTime" - это ключ сортировки .

Я хочу получить запись с "BoardId" = "1" и "DateTime", содержащей "2019".
Я использовал AWSDynamoDBObjectMapper # scan , чтобы сделать это со следующим кодом:

    let dbObjMapper = AWSDynamoDBObjectMapper.default()

    let scanExpression = AWSDynamoDBScanExpression()
    scanExpression.limit = 10
    scanExpression.filterExpression = "#id = :id AND contains(#dt, :dt)"
    scanExpression.expressionAttributeNames = [
        "#id" : "BoardId",
        "#dt" : "DateTime"
    ]
    scanExpression.expressionAttributeValues = [
        ":id" : "1",
        ":dt" : "2019"
    ]

    dbObjMapper
        .scan(Event.self, expression: scanExpression)
        .continueWith(block: {
            (task: AWSTask<AWSDynamoDBPaginatedOutput>!) -> Any? in
            if let error = task.error as NSError? {
                print("The request failed. Error: \(error)")
            } else if let paginatedOutput = task.result {
                print("The request was successful.")
                print(paginatedOutput.items.count)
                for event in paginatedOutput.items as! [Event] {
                    print(event)
                }
            }
            return ()
    })

Но я получаю пустой результат. Нет ошибки (« Запрос был успешным. »), но печать paginatedOutput.items.count равна 0. Я ожидал получить тот же результат при выполнении того же сканирования из веб-консоли DynamoDB:

dynamodb console

Что не так с моим использованием AWSDynamoDBScanExpression?

Я пытался использовать другие конфигурации сканирования:

  • не устанавливать filterExpression => OK , возвращает до 10 элементов
  • #id = :id => OK , возвращает до 10 элементов с BoardId = 1
  • contains(#dt, :dt) => без ошибок, но также возвращает пустые результаты
  • установить scanExpression.indexName для некоторого индекса, где «DateTime» не является ключом сортировки (например, «BoardId» является ключом раздела , а «Type» является ключ сортировки ) => OK , возвращает правильный элемент, аналогичный веб-консоли

Разрешено ли использовать ключ сортировки в качестве выражения фильтра?

В документации AWS SDK для iOS или в AWS Работа со документами сканирования об этом даже не говорится (здесь даже указано, что " With Scan, Вы можете указать любые атрибуты в выражении фильтра, включая атрибуты ключа раздела и ключа сортировки")

1 Ответ

0 голосов
/ 09 января 2019

Я бы попытался удалить scanExpression.limit = 10 из ваших параметров сканирования.

С https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html#DDB-Scan-request-Limit: "Максимальное количество элементов для оценки (необязательно количество подходящих элементов)."

Так что, вероятно, происходит то, что сканирование просматривает 10 элементов, затем применяет фильтр, фильтр не соответствует ни одному из них, и вы не получаете результатов

...