Как получить количество строк из DynamoDB (iOS и PHP)?

Мне нужна помощь в запросе таблицы DynamoDB, чтобы получить количество строк.

У меня есть таблица «Пользователи» с тремя полями: «Имя пользователя», «Пароль» и «Пользовательский тип». UserType может быть «Admin», «Employee» или «Guest». Теперь я хочу получить счет «Admin» в таблице. В SQL мы пишем запрос следующим образом:

SELECT COUNT(*) FROM Users WHERE UserType='Admin' 

Теперь мне нужно сделать то же самое с помощью SDK DynamoDB iOS. Пока я делаю это так.

 - (int)adminUsersCount { DynamoDBScanRequest *request = [[[DynamoDBScanRequest alloc] initWithTableName:@"Users"] autorelease]; DynamoDBCondition *condition = [[[DynamoDBCondition alloc] init] autorelease]; NSMutableArray *attrList = [NSMutableArray arrayWithObject:[[[DynamoDBAttributeValue alloc] initWithS:@"Admin"]] autorelease]]; condition.attributeValueList = attrList; condition.comparisonOperator = @"EQ"; [request setScanFilterValue:condition forKey:@"UserType"]; DynamoDBScanResponse *response = [[AmazonClientManager ddb] scan:request]; return response.items.count; } 

Здесь я собираю все строки, чтобы узнать, что подсчет. Я знаю, что это не правильный путь и действительно плохая идея. Я не знаю, как получить счет в одиночку, не выбирая все строки.

  1. Я хочу знать, как это сделать в SDK для iOS.
  2. Я хочу знать, как это сделать в PHP SDK.

Благодарю.

Я не могу ответить за PHP или IOS SDK, так как я не использую ни один из них (я использую Python). Но с низкой точки зрения DynamoDB:

  • Если все пользователи являются admin , вы можете использовать ItemCount из DescribeTable . Он обновляется только каждые 6 часов, но он бесплатный
  • Если UserType – это range_key (excelent), вы можете установить для параметра Count param of Query значение True затем прочитать поле Count ответа.
  • Во всех остальных случаях (плохо) используйте Scan, как и Query вместе со своим фильтром.

Это говорит о том, что Query и Scan всегда возвращают количество элементов. Параметр Count указывает только, чтобы они не возвращали реальные предметы. Обратите внимание, что он обслуживает только полосу пропускания. Это не будет быстрее и дешевле с точки зрения пропускной способности.

Если вы в третьем случае, я предлагаю вам перестроить вашу схему, поскольку она будет очень медленной и дорогостоящей. По всем запросам вам нужно будет пройти всю таблицу.

Для части PHP вам необходимо выполнить Scan и ваш код будет выглядеть как …

 $dynamodb = new AmazonDynamoDB(); $response = $dynamodb->scan(array( 'TableName' => 'Users', 'ScanFilter' => array( 'UserType' => array( 'ComparisonOperator' => "EQ", 'AttributeValueList' => array( array( AmazonDynamoDB::TYPE_STRING => "Admin" ) ) ) ) )); 

Теперь вам нужно подсчитать возвращенные записи.

 $count = (int) $response->body->Count; 

Теперь распечатайте его, если хотите …

 echo (string) $count; 

Для примера входа вы можете обратиться к этой записи в блоге …

Создание входа с помощью Amazon Web Services (AWS) DynamoDB