我不了解DynamoDb中查询/扫描限制的概念。根据文件:
单个查询操作最多可以检索1 MB的数据。在对结果应用任何FilterExpression之前,此限制适用。
假设我有10k个条目,每个条目250kb,所有条目都符合查询参数。
@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);
对于任何返回项目的操作,可以请求要检索的属性子集;但是,这样做对项目大小计算没有影响。此外,查询和扫描可以返回项目计数,而不是属性值。获取项目计数使用相同数量的读取容量单位,并且需要进行相同的项目大小计算。这是因为DynamoDB必须读取每个项才能增加计数。
管理已配置表上的吞吐量设置
如果我运行一个简单的查询,我只得到4个项目?
是呀
如果我使用ProjectionExpression只检索单个属性(大小为1kb),我会得到1k个项目吗?
否,filterexpressions和projectexpressions将在查询完成后应用。所以你仍然得到4个项目。
如果我只需要计算项目(选择“计数”),它会计算所有项目(10k)吗?
不,还是只有4个
这里您可能缺少的是,您仍然可以获得所有10k结果,或者10k计数,您只需要在页面中获得结果。这里有一些细节。基本上,当您完成查询时,请检查LastEvaluatedKey
属性,如果该属性不为空,则获取下一组结果。重复此操作,直到属性为空,并且您知道已获得所有结果。
编辑:我应该说一些SDK为您抽象了这一点。例如,Java SDK具有query
和queryPage
,其中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