1

来自 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 条记录中。

这发生在数百名运行类似查询的客户身上。它工作得很好,根据文档它不应该工作。

4

1 回答 1

0

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

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

在您的情况下,我将删除过滤器表达式并将结果打印到日志中,以查看您在 10 个结果中得到了什么。然后也删除限制,看看你会得到什么结果。

于 2018-11-05T08:49:06.890 回答