DynamoDB能否查询列表嵌套对象中指定字段匹配的条目?
DynamoDB查询对象列表属性的可行方案
在DynamoDB中,是否可以创建表达式来查询类型为对象列表的属性?例如表中的
POLICY_HOLDERS属性结构如下:[ {PID: 1, FIRST_NAME: "Bob", LAST_NAME: "Smith"}, {PID: 2, FIRST_NAME: "Betty", LAST_NAME: "Johns"} ]我尝试使用Java AWS SDK编写以下表达式,希望找到所有
POLICY_HOLDERS列表中存在FIRST_NAME等于"Betty"的对象的条目,但未查询到任何结果,请问这种查询是否可行?String filterExpressionString = "contains(POLICY_HOLDERS, :POLICY_HOLDER)"; expressionAttributeValues.put(":POLICY_HOLDER", AttributeValue.builder() .m(Map.of("FIRST_NAME", AttributeValue.builder().s("Betty").build())) .build());
这种查询是可行的,但你当前的写法存在问题,导致无法匹配到结果:
问题原因
你使用的contains(POLICY_HOLDERS, :POLICY_HOLDER)是检查列表中是否存在完全匹配的对象,但你传入的:POLICY_HOLDER仅包含FIRST_NAME字段,而表中实际的列表对象还带有PID和LAST_NAME字段,两者无法完全匹配,因此查询不到结果。
正确实现方式
要查询列表中是否存在某个对象满足特定属性条件,需要使用DynamoDB表达式的列表元素条件过滤语法,通过[?()]路径操作符定位符合条件的列表元素,结合exists函数判断是否存在匹配项:
Java SDK代码示例
String filterExpressionString = "exists(POLICY_HOLDERS[?(@.FIRST_NAME = :betty)])"; expressionAttributeValues.put(":betty", AttributeValue.builder() .s("Betty") .build());
补充说明
POLICY_HOLDERS[?(@.FIRST_NAME = :betty)]会遍历POLICY_HOLDERS列表中的每个对象,检查其FIRST_NAME属性是否等于:betty的值exists()函数用于判断是否存在符合条件的元素,只要有一个匹配就会返回该条目- 这种方式无需匹配整个对象,仅需检查目标属性即可,完全满足你的查询需求
内容的提问来源于stack exchange,提问作者Shane Rowatt
相关产品推荐
相关产品推荐

