我需要帮助查询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;
}
我在这里获取所有行以了解该计数。我知道这不是正确的方法,而且确实是一个坏主意。我不知道如何在不取出所有行的情况下单独获取计数。
感谢。
答案 0 :(得分:11)
我无法回答PHP或IOS SDK,因为我没有使用它们(我使用Python)。但是,从DynamoDB的低级别来看:
ItemCount
中的DescribeTable
。它每6小时更新一次,但它是免费的UserType
是range_key
(优秀),您可以将Count
的{{1}}参数设置为Query
然后阅读True
答案的字段。Count
一样使用扫描以及过滤条件。这就是说,Query
和Query
将始终返回项目计数。 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;
对于登录示例,您可以参考此博客条目...