Проблема со scan в dynamodb

202
08 июля 2022, 16:40

Пытаюсь сделать scan в dynamodb, с использованием PHP и пакета aws/aws-sdk-php Мне нужно найти непрочитанные уведомления для определенных аккаунтов. Кроме того, уведомления должны быть определнных типов. Аккаунтов и типов может быть несколько.

Вот как я пытаюсь это делать на PHP

public function getUnreadNotifications($accountIds): array
    {
        $expressionValues = $this->marshaler->marshalItem([
            ':readStatus' => Notification::STATUS_NOT_READ
        ]);
        $params = [
            'FilterExpression' => 'read_status = :readStatus'
        ];
        /**
         * Добавляем выборку по типу
         */
        $typeKeys = [];
        foreach (Notification::TYPES as $typeIndex => $type) {
            $typeKeys[':type_' . $typeIndex] = $this->marshaler->marshalValue($type);
        }
        $accountIdKeys = [];
        foreach ($accountIds as $accountIdIndex => $accountId) {
            $accountIdKeys[':account_id_' . $accountIdIndex] = $this->marshaler->marshalValue($accountId);
        }
        $expressionValues = array_merge($expressionValues, $typeKeys, $accountIdKeys);
        $params['FilterExpression'] .= sprintf(' and #type IN (%s) and #account_id IN (%s)',
            implode(',', array_keys($typeKeys)),
            implode(',', array_keys($accountIdKeys))
        );
        $params['ExpressionAttributeNames'] = [
            '#type' => 'type',
            '#account_id' => 'account_id',
        ];

        $params = array_merge($params, [
            'TableName' => $this->getTableName(),
            'ExpressionAttributeValues' => $expressionValues,
        ]);
        return $this->scan($params);
    }

Однако в результате получаю пустой массив например для моего аккаунта

При этом запрос из консоли к dynamodb работает как надо

/usr/local/bin/aws dynamodb scan --table-name Notifications --expression-attribute-values '{":account_id_0":{"N":"15"}, ":readStatus":{"N":"0"}, ":type_0":{"S":"account_document_verified"}, ":type_1":{"S":"card_payment"}}' --expression-attribute-names '{"#type":"type", "#account_id":"account_id"}' --filter-expression "read_status = :readStatus and #type IN (:type_0,:type_1) and #account_id IN (:account_id_0)" --endpoint=http://localhost:8000

Как выглядит при этом массив $params с параметрами для dynamodb из примера кода

  'FilterExpression' =>
  string(78) "read_status = :readStatus and #type IN (:type_0,:type_1) and #account_id IN ()"
  'ExpressionAttributeNames' =>
  array(2) {
    '#type' =>
    string(4) "type"
    '#account_id' =>
    string(10) "account_id"
  }
  'TableName' =>
  string(13) "Notifications"
  'ExpressionAttributeValues' =>
  array(3) {
    ':readStatus' =>
    array(1) {
      'N' =>
      string(1) "0"
    }
    ':type_0' =>
    array(1) {
      'S' =>
      string(25) "account_document_verified"
    }
    ':type_1' =>
    array(1) {
      'S' =>
      string(12) "card_payment"
    }
  }
}

Что я делаю не так? Ведь то, что я составил на PHP по идее идентично чистому запросу.

Answer 1

Правильный ответ: нужно было сканировать таблицу с использованием LastEvaluatedKey

READ ALSO
как послать из php данные на nodejs websocket сервер

как послать из php данные на nodejs websocket сервер

Прошу помощиМне необходимо посылать данные из php7

188
Модификация без словаря

Модификация без словаря

Дано следующее задание: Вводится текстКонец ввода F1

201
Нет расстановки по убыванию [дубликат]

Нет расстановки по убыванию [дубликат]

Подскажите пожалуйста , как решить проблемуВвожу текст , жму F3 и программа завершается без расстановки

249
TcpClient не принимает данные

TcpClient не принимает данные

Есть код принятия данных с TcpClientОн работает в таске, имитирующем клиент, но не в классе клиента

186