查询DynamoDB中的大小限制

时间:2018-02-16 09:20:36

标签: amazon-dynamodb

我没有在DynamoDb中获得查询/扫描限制的概念。 根据文件:

  

单个Query操作最多可以检索1 MB的数据。这个   在将任何FilterExpression应用于结果之前适用限制。

假设我有10k项,每项250kb,所有这些都适合查询参数。

  1. 如果我运行一个简单的查询,我只能获得4项?
  2. 如果我使用ProjectionExpression只检索单个属性(1kb     在尺寸上),我会获得1k物品吗?
  3. 如果我只需要计算项目(选择:'COUNT'),它会全部计算     物品(10k)?

3 个答案:

答案 0 :(得分:8)

如果我运行一个简单的查询,我只能获得4项?

如果我使用ProjectionExpression只检索单个属性(大小为1kb),我会获得1k项吗?

不,在查询完成后应用filterexpressions和projectexpressions。所以你仍然可以获得4件物品。

如果我只需要计算项目(选择:'COUNT'),它会计算所有项目(10k)吗?

No, still just 4

你可能在这里遗漏的是你仍然可以获得所有10k的结果,或者10k计数,你只需要在页面中得到结果。一些details here。基本上,当您完成查询时,请检查LastEvaluatedKey属性,如果它不为空,请获取下一组结果。重复此操作,直到属性为空,并且您知道自己拥有所有结果。

编辑:我应该说一些SDK为你抽象出来。例如,Java SDK有queryqueryPage,其中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必须读取每个项目才能增加计数。

Managing Throughput Settings on Provisioned Tables