【发布时间】:2021-03-13 03:28:12
【问题描述】:
目前,我有一个使用 SCAN 选项从 DynamoDB 表中获取所有项目的功能。这是一种昂贵的方法,我更喜欢使用 QUERY 选项。但是查看文档似乎没有一种简单的方法可以使用 QUERY 选项检索所有项目 - 它需要某种条件。
示例
var params = {
TableName : "Movies",
KeyConditionExpression: "#yr = :yyyy",
ExpressionAttributeNames:{
"#yr": "year"
},
ExpressionAttributeValues: {
":yyyy": 1985
}
};
docClient.query(params, function(err, data) {
if (err) {
console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
} else {
console.log("Query succeeded.");
data.Items.forEach(function(item) {
console.log(" -", item.year + ": " + item.title);
});
}
});
预期
var params = {
TableName : "Movies"
};
docClient.query(params, function(err, data) {
if (err) {
console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
} else {
console.log("Query succeeded.");
data.Items.forEach(function(item) {
console.log(" -", item.year + ": " + item.title);
});
}
});
是否可以使用 QUERY 从表中检索所有数据?我想过使用 BEGINS_WITH 等,但所有主键都是不同的/随机的,并且不以特定字符或短语开头。
【问题讨论】:
-
假设您可以使用 query 获取所有项目,这会比使用 scan 在实质上更好吗?
-
@jarmod 扫描操作通常更慢且更昂贵,因为该操作必须遍历表中的每个项目以获取我请求的项目。这是我不想使用扫描的主要原因..
-
但是无论如何你都会得到所有的项目,除非你实际上并不是指“所有项目”。事实上,查询路由可能会比扫描慢。
-
所有项目都正确。我将通过一些研究点,例如下面的链接,其中指出查询操作预计会非常快,并且仅比 get 操作慢一点。另一方面,扫描操作可能需要 50-100 毫秒到几个小时才能完成,具体取决于表的大小。我对此的理解可能是错误的.. techtraits.com/cloud/nosql/2012/06/28/…
-
它们是不同的。与预先知道分区键和排序键(或排序键范围)的查询相比,扫描查找特定项目需要更长的时间。但是您说的是“所有项目”,因此事先没有已知的密钥,因此,在理论上查询可以为您提供所有项目的世界中,它不会比扫描更好。也就是说,查询不提供了获取所有项目的方法,所以这是一个有争议的问题。
标签: node.js amazon-web-services amazon-dynamodb