AWS DynamoDB 扫描过滤器表达式返回空
AWS DynamoDB Scan Filter Expression Returning Empty
我很难弄清楚为什么我的扫描 return 除了 [ ]。这是我的扫描参数:
var params = {
TableName: tableName,
FilterExpression: "#wager = :wager",
ExpressionAttributeNames: {
"#wager": "wager"
},
ExpressionAttributeValues: {
":wager": wager
}
};
当我在 DynamoDB 仪表板中 运行 过滤表达式时,我的 DynamoDB table 完美运行,例如“赌注 [NUMBER] = 0.001”。
jellycsc 和 Seth Geoghegan 已经在评论中提到了两个最可能的解释:
首先,请确保您没有调用单个 Scan
操作,而是执行 循环 以获取所有 页数 扫描结果。执行此操作的具体方法取决于您使用的编程语言。当您的过滤器只留下一小部分结果时(例如,仅当工资恰好为 0.001 时)请记住阅读所有页面很关键,因为第一页可能是空的:DynamoDB 可能已读取 1MB 的项目(默认页面大小), none 其中匹配 wager=0.001 所以空白的第一页是 return.
其次,wager
的类型可能有误。显然,如果您存储数字但搜索字符串,则不会匹配任何内容,因此请检查您没有这样做。但更微妙的问题可能是如何存储数字。 DynamoDB 以一种不寻常的方式保存浮点数——使用十进制而不是二进制数字。这意味着 DynamoDB 可以精确地保存数字“0.001”,没有任何舍入误差。对于大多数编程语言来说,情况并非如此。在我的机器上,如果我将“double”变量设置为 0.001,则结果为 0.0010000000000000000208。如果我将其传递给 DynamoDB,相等性检查将不匹配!这意味着您应该确保 wager
变量是 而不是 双重变量。例如,在 Python 中,wager
应设置为 Decimal("0.001")
- 注意它是如何从字符串“0.001”构造的,而不是从已经有舍入误差的浮点数 0.001 构造的。
感谢大家的想法。结果确实是一个类型问题——我所要做的就是将“赌注”转换为
wager = Number(wager);
在设置扫描参数之前(我在问题中使用的相同参数)。
我很难弄清楚为什么我的扫描 return 除了 [ ]。这是我的扫描参数:
var params = {
TableName: tableName,
FilterExpression: "#wager = :wager",
ExpressionAttributeNames: {
"#wager": "wager"
},
ExpressionAttributeValues: {
":wager": wager
}
};
当我在 DynamoDB 仪表板中 运行 过滤表达式时,我的 DynamoDB table 完美运行,例如“赌注 [NUMBER] = 0.001”。
jellycsc 和 Seth Geoghegan 已经在评论中提到了两个最可能的解释:
首先,请确保您没有调用单个 Scan
操作,而是执行 循环 以获取所有 页数 扫描结果。执行此操作的具体方法取决于您使用的编程语言。当您的过滤器只留下一小部分结果时(例如,仅当工资恰好为 0.001 时)请记住阅读所有页面很关键,因为第一页可能是空的:DynamoDB 可能已读取 1MB 的项目(默认页面大小), none 其中匹配 wager=0.001 所以空白的第一页是 return.
其次,wager
的类型可能有误。显然,如果您存储数字但搜索字符串,则不会匹配任何内容,因此请检查您没有这样做。但更微妙的问题可能是如何存储数字。 DynamoDB 以一种不寻常的方式保存浮点数——使用十进制而不是二进制数字。这意味着 DynamoDB 可以精确地保存数字“0.001”,没有任何舍入误差。对于大多数编程语言来说,情况并非如此。在我的机器上,如果我将“double”变量设置为 0.001,则结果为 0.0010000000000000000208。如果我将其传递给 DynamoDB,相等性检查将不匹配!这意味着您应该确保 wager
变量是 而不是 双重变量。例如,在 Python 中,wager
应设置为 Decimal("0.001")
- 注意它是如何从字符串“0.001”构造的,而不是从已经有舍入误差的浮点数 0.001 构造的。
感谢大家的想法。结果确实是一个类型问题——我所要做的就是将“赌注”转换为
wager = Number(wager);
在设置扫描参数之前(我在问题中使用的相同参数)。