如何从DynamoDB(iOS和PHP)获取行数?

我需要帮助查询DynamoDB表来获取行数。

考虑一下,我有一个表“用户”有三个字段,“用户名”,“密码”和“用户types”。 UserType可以是“Admin”,“Employee”或@“Guest”。 现在我想要得到表中“Admin”的数量。 在SQL中,我们写这样的查询,

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

现在我需要使用DynamoDB iOS SDK来做同样的事情。 现在,我正在这样做。

 - (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. 我想知道如何在iOS SDK中做到这一点。
  2. 我想知道如何在PHP SDK中做到这一点。

谢谢。

我不能回答PHP或IOS SDK,因为我都没有使用(我使用Python)。 但从DynamoDB的一个低层次来看:

  • 如果所有用户都是admin ,则可以使用ItemCount 。 它每6小时更新一次,但是免费
  • 如果UserTyperange_key (excelent),则可以将Query Count参数设置为True然后读取答案的Count字段。
  • 在所有其他情况下 (不好),请使用扫描,就像使用Query以及您的过滤条件一样。

这就是说, QueryScan将始终返回项目计数。 Count参数只是指示他们不要返回真实的项目。 请注意,它只能节省带宽。 就预配吞吐量而言,它不会更快也不会更便宜。

如果你在第三种情况下,我build议你重新devise你的模式,因为这将是非常缓慢和昂贵的。 在所有的请求,你需要通过整个表。

对于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返回的logging。

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

现在打印它,如果你想…

 echo (string) $count; 

对于login的例子,你可以参考这个博客条目…

使用Amazon Web Services(AWS)DynamoDB创buildlogin