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

时间:2012-11-06 05:29:49

标签: php ios amazon-web-services amazon-dynamodb

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

考虑一下,我有一个表“Users”有三个字段,“UserName”,“Password”和“UserType”。 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中做到这一点。
  3. 感谢。

2 个答案:

答案 0 :(得分:11)

我无法回答PHP或IOS SDK,因为我没有使用它们(我使用Python)。但是,从DynamoDB的低级别来看:

  • 如果所有用户都是管理员,您可以使用ItemCount中的DescribeTable。它每6小时更新一次,但它是免费的
  • 如果UserTyperange_key (优秀),您可以将Count的{​​{1}}参数设置为Query然后阅读True答案的字段。
  • 在所有其他情况下(错误),请像使用Count一样使用扫描以及过滤条件。

这就是说,QueryQuery将始终返回项目计数。 Scan参数仅指示他们不返回实际项目。请注意,它只会节省带宽。在提供的吞吐量方面,它不会更快,也不会更便宜。

如果您处于第三种情况,我建议您重新设计您的架构,因为它非常缓慢且昂贵。在所有要求中,您都需要浏览整个表格。

答案 1 :(得分:2)

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

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

现在打印出来,如果你想......

echo (string) $count;

对于登录示例,您可以参考此博客条目...

Creating Login with Amazon Web Services' (AWS) DynamoDB