DynamoDB QuerySpec {MaxResultSize +过滤器表达式}

时间:2018-11-05 01:59:42

标签: amazon-web-services amazon-dynamodb aws-sdk dynamodb-queries

从DynamoDB documentation

  

查询操作使您可以限制其查询的项目数   返回结果。为此,请将Limit参数设置为   您想要的最大物品数。

     

例如,假设您查询一个表,其限值为6,并且   没有过滤器表达式。查询结果将包含第一个   表中的六个项与来自   请求。

     

现在假设您向查询中添加了一个过滤器表达式。在这种情况下,   DynamoDB会将过滤器表达式应用于以下六个项目:   返回,丢弃不匹配的内容。最终查询结果   将包含6个或更少的项目,具体取决于   被过滤。

类似以下查询应该(至少有时)返回0条记录。

总而言之,我有一个UserLogins表。简化的版本是:

1. UserId - HashKey
2. DeviceId - RangeKey
3. ActiveLogin - Boolean
4. TimeToLive - ...

现在,假设UserId = X在不同的DeviceId中有10,000个无效登录,而在1个活动登录中。

但是,当我针对我的DynamoDB表运行此查询时:

QuerySpec{
hashKey: null,
rangeKeyCondition: null,
queryFilters: null, 
nameMap: {"#0" -> "UserId"}, {"#1" -> "ActiveLogin"}
valueMap: {":0" -> "X"}, {":1" -> "true"}
exclusiveStartKey: null,
maxPageSize: null, 
maxResultSize: 10,
req: {TableName: UserLogins,ConsistentRead: true,ReturnConsumedCapacity: TOTAL,FilterExpression: #1 = :1,KeyConditionExpression: #0 = :0,ExpressionAttributeNames: {#0=UserId, #1=ActiveLogin},ExpressionAttributeValues: {:0={S: X,}, :1={BOOL: true}}}

我总是得到1行。 UserId = X的1个活动登录名。而且这不仅发生在1位用户身上,还发生在类似情况下的多位用户身上。

我的结果是否与DynamoDB文档相矛盾?

这似乎是一个矛盾,因为如果maxResultSize = 10,则意味着DynamoDB仅读取前10个项目(总数为10,001),然后它将仅应用过滤器active = true(可能返回0结果)。 DynamoDB读取的前10条记录似乎不太可能具有active = true的记录。

正在运行类似查询的数百个客户正在发生这种情况。效果很好,根据文档显示不起作用。

1 个答案:

答案 0 :(得分:0)

我看不到查询有任何明显的问题。您确定您的前提是每个用户都有10,000个项目吗?

您的密钥是UserId和DeviceId。这似乎意味着,如果您的用户使用同一设备登录,它将覆盖现有项目。或换种说法,我想您是说您的用户每人拥有10,000个不同的设备(除非DeviceId以某种方式旋转)。

在您的鞋子中,我只是删除filterexpression并将结果打印到日志中,以查看10个结果中的结果。然后也删除该限制,看看您将获得什么结果。