我需要在DynamoDB上进行限制和条件扫描。为什么使用Limit和FilterExpression进行DynamoDB扫描不会返回符合过滤器要求的项目?
的docs说:
在响应,DynamoDB返回限制值的范围内的所有匹配的结果。例如,如果您发出限值为6且没有过滤器表达式的查询或扫描请求,则DynamoDB会返回表中与请求中指定的关键条件匹配的前六个项目(或者仅返回前六个项目扫描不带过滤器的情况)。如果您还提供FilterExpression值,那么DynamoDB将返回前六个中也与过滤器要求相匹配的项目(返回结果的数量将小于或等于6)。
的代码(的NodeJS):
var params = {
ExpressionAttributeNames: {"#user": "User"},
ExpressionAttributeValues: {":user": parseInt(user.id)},
FilterExpression: "#user = :user and attribute_not_exists(Removed)",
Limit: 2,
TableName: "XXXX"
};
DynamoDB.scan(params, function(err, data) {
if (err) {
dataToSend.message = "Unable to query. Error: " + err.message;
} else if (data.Items.length == 0) {
dataToSend.message = "No results were found.";
} else {
dataToSend.data = data.Items;
console.log(dataToSend);
}
});
表XXXX定义:
- 主分区键:用户(数量)
- 主排序关键字:标识符(字符串)
- INDEX:
- 指数名称:RemovedIndex
- 类型:GSI
- 分区键:删除(号码)
- 排序键: -
- 属性:ALL
在上面的代码中,如果我删除Limit
参数,DynamoDB将返回符合过滤器要求的项目。所以,条件是好的。但是当我用Limit
参数扫描时,结果是空的。
该XXXX表,有5个项目。只有2个第一个具有Removed
属性。当我在没有Limit
参数的情况下扫描时,DynamoDB将返回3个不带Removed
属性的项目。
我做错了什么?
谢谢你的回答!我不明白该文件,你向我澄清。你有关于如何在RDBMS中使用'limit'的提示吗? –
对此有一些疑惑:https://github.com/clarkie/dynogels/issues/12这种有用的行为如何?确定扫描,直到你有6个物品与过滤器相匹配,或者你到达表格的最后会更有用? – Clarkie
@Clarkie这很有用,因为它允许您限制扫描操作评估的记录数,这是出于性能原因。仅仅因为它不像RDBMS一样工作并不意味着它没有用处。另外,你对Github的评论关于“对文档所说的一些混淆”似乎对我不正确。文档(正如我在我的回答中引用的)非常清楚。混淆来自那些认为'limit'在DynamoDB中的工作方式与RDBMS中的方式相同,而无需花时间阅读文档。 –