如何从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; }
在这里,我正在获取所有的行来知道这个数量。 我知道这不是正确的方式,是一个坏主意。 我不知道如何在没有提取所有行的情况下单独计数。
- 我想知道如何在iOS SDK中做到这一点。
- 我想知道如何在PHP SDK中做到这一点。
谢谢。
我不能回答PHP或IOS SDK,因为我都没有使用(我使用Python)。 但从DynamoDB的一个低层次来看:
- 如果所有用户都是admin ,则可以使用
ItemCount
。 它每6小时更新一次,但是免费 - 如果
UserType
是range_key
(excelent),则可以将Query
Count
参数设置为True
然后读取答案的Count
字段。 - 在所有其他情况下 (不好),请使用扫描,就像使用
Query
以及您的过滤条件一样。
这就是说, Query
和Scan
将始终返回项目计数。 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