当前位置: 首页 > 知识库问答 >
问题:

DynamoDB中的查询大小限制

晁文斌
2023-03-14

我不了解DynamoDb中查询/扫描限制的概念。根据文件:

单个查询操作最多可以检索1 MB的数据。在对结果应用任何FilterExpression之前,此限制适用。

假设我有10k个条目,每个条目250kb,所有条目都符合查询参数。

  1. 如果我运行一个简单的查询,我只得到4个项目?

共有3个答案

慕才
2023-03-14

@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);

编辑:

import AWS from 'aws-sdk';

async function loopQuery(params) {
  let keepGoing = true;
  let result = null;
  let list = [];
  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;
      list = [...list, ...result]
    }
  }
  return list;
}


const params = {
    TableName: user,
    IndexName: 'userOrder',
    KeyConditionExpression: 'un=:n',
    ExpressionAttributeValues: {
      ':n': {
        S: name,
      },
    },
    ConsistentRead: false,
    ReturnConsumedCapacity: 'NONE',
    ProjectionExpression: ALL,
  };

  const result = await loopQuery(params);

苏昂雄
2023-03-14

对于任何返回项目的操作,可以请求要检索的属性子集;但是,这样做对项目大小计算没有影响。此外,查询和扫描可以返回项目计数,而不是属性值。获取项目计数使用相同数量的读取容量单位,并且需要进行相同的项目大小计算。这是因为DynamoDB必须读取每个项才能增加计数。

管理已配置表上的吞吐量设置

楚承天
2023-03-14

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

是呀

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

否,filterexpressions和projectexpressions将在查询完成后应用。所以你仍然得到4个项目。

如果我只需要计算项目(选择“计数”),它会计算所有项目(10k)吗?

不,还是只有4个

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

编辑:我应该说一些SDK为您抽象了这一点。例如,Java SDK具有queryqueryPage,其中query将多次返回服务器以获取完整的结果集(即,在您的情况下,为您提供完整的10k结果)。

 类似资料:
  • 我对DynamoDB上的查询/扫描限制有疑问。 我的表有1000条记录,对所有记录的查询都返回50个值,但是如果我把设为5,这并不意味着查询将返回前5个值,它只是说对5个项目的查询表(以任何顺序,所以它们可能是非常旧的项目或新的项目),所以我有可能在查询中得到0个项目。如何实际获得查询的最新5项?我需要设置一个为5(数字是例子),因为查询/扫描更多的项目会很昂贵。 该查询具有此输入 我的表的索引是

  • DynamoDB的文档中说: 在查询操作中,DynamoDB按排序顺序检索项目,然后使用可能存在的任何过滤表达式(FilterExpression)和关键字条件表达式(KeyConditionExpression)处理项目。 以及: 单个查询操作最多可以检索1 MB的数据。在将任何应用于结果之前,此限制适用。 这是否意味着在此1MB限制之前应用了关键条件表达式?

  • 我试图理解AWS DynamoDB的行为到底是什么。当我为表创建本地二级索引(LSI)时,文档中说,项集合有10 GB的限制。文档 它的真正含义是什么? 假设我的数据跨3个分区,那么问题是: 每个分区对LSI或所有分区都有10GB的限制? 如果我达到了一个限制,比方说,我继续将数据写入表中,这意味着数据将在表中,但不会被LSI看到?或者怎么做?我知道通常数据将在表中可用,但如果我通过LSI查询,它

  • Spring Data允许开发者使用first和top关键字对返回的查询结果集大小进行限定。fisrt和top需要跟着一个代表返回的结果集的最大大小的数字。如果没有跟着一个数字,那么返回的结果集大小默认为1。 Example 8.Limiting the result size of query with Top and First(利用first和top限制返回的结果集大小) User find

  • 我有一个要求,在Dynamodb中查询表时只需要返回一行。我可以在aws cli中看到一个名为“max items”的参数,它显然限制了查询的结果大小。以下是示例查询: 但我无法在Go中找到任何类似的关键字/属性。 以下是我可以找到的相关内容:如何使用Java设置DynamoDB返回的匹配项的限制?

  • 使用javascript aws sdk和查询dynamodb表,以及文档客户端。该表包含10个元素,查询限制=5。 对于每个请求,我使用LastEvaluatedKey构建一个新查询并发送一个新请求,结果如下: 根据这份文件 如果结果包含LastEvaluatedKey元素,请转至步骤2。如果结果中没有LastEvaluatedKey,则没有其他要检索的项 它应该不会在第二个请求中返回LastE