我没有在DynamoDb中获得查询/扫描限制的概念。 根据文件:
单个Query操作最多可以检索1 MB的数据。这个 在将任何FilterExpression应用于结果之前适用限制。
假设我有10k项,每项250kb,所有这些都适合查询参数。
答案 0 :(得分:8)
如果我运行一个简单的查询,我只能获得4项?
是
如果我使用ProjectionExpression只检索单个属性(大小为1kb),我会获得1k项吗?
不,在查询完成后应用filterexpressions和projectexpressions。所以你仍然可以获得4件物品。
如果我只需要计算项目(选择:'COUNT'),它会计算所有项目(10k)吗?
你可能在这里遗漏的是你仍然可以获得所有10k的结果,或者10k计数,你只需要在页面中得到结果。一些details here。基本上,当您完成查询时,请检查LastEvaluatedKey
属性,如果它不为空,请获取下一组结果。重复此操作,直到属性为空,并且您知道自己拥有所有结果。
编辑:我应该说一些SDK为你抽象出来。例如,Java SDK有query
和queryPage
,其中query
将多次返回服务器以获取完整的结果集(例如,在您的情况下,给您全部10k结果)。
答案 1 :(得分:1)
@ f-so-k的精彩解释。
这就是我处理查询的方式。
import AWS from 'aws-sdk';
async function loopQuery(params) {
let keepGoing = true;
let result = null;
while (keepGoing) {
let newParams = params;
if (result && result.LastEvaluatedKey) {
newParams = {
...params,
ExclusiveStartKey: result.LastEvaluatedKey,
};
}
result = await AWS.query(newParams).promise();
if (result.count > 0 || !result.LastEvaluatedKey) {
keepGoing = false;
}
}
return result;
}
const params = {
TableName: user,
IndexName: 'userOrder',
KeyConditionExpression: 'un=:n',
ExpressionAttributeValues: {
':n': {
S: name,
},
},
ConsistentRead: false,
ReturnConsumedCapacity: 'NONE',
ProjectionExpression: ALL,
};
const result = await loopQuery(params);
答案 2 :(得分:-2)
对于任何返回项目的操作,您可以请求属性的子集以进行检索;但是,这样做对项目大小的计算没有影响。另外,查询和扫描可以返回项目计数而不是属性值。获取项目计数将使用相同数量的读取容量单位,并且需要进行相同的项目尺寸计算。这是因为DynamoDB必须读取每个项目才能增加计数。