DynamoDB查询中,如何在未知属性值时比较同项目内的两个属性?
DynamoDB同项目内字段值对比筛选问题解决
你之前的错误在于完全用错了ExpressionAttributeNames的作用——它是用来替换属性名称的占位符,不是绑定字段值的。你把#toDo映射成info.toDo的实际值,这不符合它的设计逻辑,所以查询不会返回任何数据。
要筛选info.toDo等于info.done的项目,DynamoDB支持直接在FilterExpression里对比同一个项目的两个属性值,不需要用到ExpressionAttributeValues(它是用来传递外部对比值的,不是表内字段)。
正确实现方式
方式1:直接使用属性路径
如果属性名称没有和DynamoDB关键字冲突,直接在FilterExpression里写完整属性路径即可:
const params = { TableName: '你的目标表名', FilterExpression: 'info.toDo = info.done' };
方式2:用ExpressionAttributeNames替换属性名(适用于属性名含特殊字符或关键字的情况)
如果info、toDo或done是DynamoDB保留关键字,或者属性名有特殊字符,可以用占位符替换属性名称:
const params = { TableName: '你的目标表名', ExpressionAttributeNames: { '#info': 'info', '#toDo': 'toDo', '#done': 'done' }, FilterExpression: '#info.#toDo = #info.#done' };
注意事项
- FilterExpression是在查询/扫描拿到数据后再做过滤,不是存储层级别的过滤,所以如果表数据量很大,扫描的读写成本会比较高,需要评估场景是否适用。
内容的提问来源于stack exchange,提问作者user17124754
相关产品推荐
相关产品推荐

