来自 DynamoDB文档
Query 操作允许您限制它在结果中返回的项目数。为此,请将 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 个结果)。active=true 的记录似乎不太可能出现在 DynamoDB 读取的前 10 条记录中。
这发生在数百名运行类似查询的客户身上。它工作得很好,根据文档它不应该工作。