dynamodb索引不return所有数据
dynamodb index does not return all data
我有一个 table storedgames
,其中包含 2092 个项目。
它还有一个关于 table 的索引,其中还列出了 2092 个项目。
当我获取数据时,我使用索引来获取一个特定用户的项目。
const params = {
TableName: "storedgames",
IndexName: "user-index",
KeyConditionExpression: "#usr = :usr",
ExpressionAttributeNames: { "#usr": "user" },
ExpressionAttributeValues: { ":usr": user }
};
const data = await new Promise((resolve, reject) => {
docClient.query(params, (err, data) => {
if (err) { reject(err); } else { resolve(data); }
});
}).catch((err) => {
console.error(err);
return false;
});
但是,上面的代码并没有return所有项目。它只找到 42 个。对于今天的项目,只有 1 个命中。当我直接在 AWS 网页上查看时,我实际上找到了今天的更多项目。
即使我使用索引执行此操作,它也会找到更多记录。
当我不考虑当天的筛选时,我实际上找到了 130 多个项目,
而我的 javascript 代码只有 returns 42 项,当我忽略了日期过滤器时。
所以我的问题是,为什么当我以编程方式调用它时,我的索引数据似乎不完整?
这些记录实际上包含很多数据,而且每次查询可以获取的数据量似乎有限制。
A single Query operation can retrieve a maximum of 1 MB of data. This
limit applies before any FilterExpression is applied to the results.
If LastEvaluatedKey is present in the response and is non-null, you
must paginate the result set (see Paginating the Results).
因此,我的一个可能解决方案是执行多次提取,直到您拥有整个集合。
const queryAllItems = (params, callback) => {
let fullResult = { Items: [], Count: 0, ScannedCount: 0 };
const queryExecute = (callback) => {
docClient.query(params, (err, result) => {
if (err) {
callback(err);
return;
}
const { Items, LastEvaluatedKey, Count, ScannedCount } = result;
fullResult.Items = [...fullResult.Items, ...Items];
fullResult.Count += Count;
fullResult.ScannedCount += ScannedCount;
if (!LastEvaluatedKey) {
callback(null, fullResult);
return;
}
params.ExclusiveStartKey = LastEvaluatedKey;
queryExecute(callback);
});
}
queryExecute(callback);
}
遗憾的是,这不是一个完整的解决方案。在我的情况下,仅查询 130 项(需要 4 次实际提取)大约需要 15 秒。
我有一个 table storedgames
,其中包含 2092 个项目。
它还有一个关于 table 的索引,其中还列出了 2092 个项目。
当我获取数据时,我使用索引来获取一个特定用户的项目。
const params = {
TableName: "storedgames",
IndexName: "user-index",
KeyConditionExpression: "#usr = :usr",
ExpressionAttributeNames: { "#usr": "user" },
ExpressionAttributeValues: { ":usr": user }
};
const data = await new Promise((resolve, reject) => {
docClient.query(params, (err, data) => {
if (err) { reject(err); } else { resolve(data); }
});
}).catch((err) => {
console.error(err);
return false;
});
但是,上面的代码并没有return所有项目。它只找到 42 个。对于今天的项目,只有 1 个命中。当我直接在 AWS 网页上查看时,我实际上找到了今天的更多项目。
即使我使用索引执行此操作,它也会找到更多记录。
当我不考虑当天的筛选时,我实际上找到了 130 多个项目, 而我的 javascript 代码只有 returns 42 项,当我忽略了日期过滤器时。
所以我的问题是,为什么当我以编程方式调用它时,我的索引数据似乎不完整?
这些记录实际上包含很多数据,而且每次查询可以获取的数据量似乎有限制。
A single Query operation can retrieve a maximum of 1 MB of data. This limit applies before any FilterExpression is applied to the results. If LastEvaluatedKey is present in the response and is non-null, you must paginate the result set (see Paginating the Results).
因此,我的一个可能解决方案是执行多次提取,直到您拥有整个集合。
const queryAllItems = (params, callback) => {
let fullResult = { Items: [], Count: 0, ScannedCount: 0 };
const queryExecute = (callback) => {
docClient.query(params, (err, result) => {
if (err) {
callback(err);
return;
}
const { Items, LastEvaluatedKey, Count, ScannedCount } = result;
fullResult.Items = [...fullResult.Items, ...Items];
fullResult.Count += Count;
fullResult.ScannedCount += ScannedCount;
if (!LastEvaluatedKey) {
callback(null, fullResult);
return;
}
params.ExclusiveStartKey = LastEvaluatedKey;
queryExecute(callback);
});
}
queryExecute(callback);
}
遗憾的是,这不是一个完整的解决方案。在我的情况下,仅查询 130 项(需要 4 次实际提取)大约需要 15 秒。