0

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

考虑一下,我有一个表“用户”,其中包含三个字段,“用户名”、“密码”和“用户类型”。UserType 可以是“Admin”、“Employee”或@“Guest”。现在我想获得表中“管理员”的计数。在 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 中做到这一点。

谢谢。

4

2 回答 2

11

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

  • 如果所有用户都是 admin,则可以使用ItemCountfrom DescribeTable。它每 6 小时更新一次,但它是免费的
  • 如果UserTyperange_key(优秀),您可以将Count参数设置QueryTrue然后读取Count答案的字段。
  • 在所有其他情况下(不好),请使用 ScanQuery以及您的过滤条件。

这就是说,Query并且Scan将始终返回项目计数。该Count参数仅指示他们不要返回真实物品。请注意,它只节省带宽。就预置吞吐量而言,它不会更快也不会更便宜。

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

于 2012-11-06T14:33:21.800 回答
2

对于 PHP 部分,您需要执行 aScan并且您的代码看起来像...

$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;

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

使用 Amazon Web Services (AWS) DynamoDB 创建登录

于 2012-11-20T14:56:49.570 回答