我正在查询dynamoDB, 我有hashKey(objectId),我有sortKey(versionId)的前缀。
我想实现以下目标:
QuerySpec querySpec = new QuerySpec();
querySpec.withKeyConditionExpression("objectId = :v_objectId and (annotationIdVersion IN (:v_objectId, begins_with(versionId, :v_prefix)))")
.withValueMap(new ValueMap().withString(":v_objectId", objectId).withString(":v_prefix", "v0_"));
table.query(querySpec);
在上面的示例中,我试图检查我的versionId是否等于“ objectId”或“ some_prefix”。
我发现dynamoDB中的begins_with函数有助于实现基于前缀的查询。
但是我不确定IN运算符是否采用Begins_with函数。我正在寻找有关实现上述用例的任何建议。
任何建议将不胜感激。提前致谢。
答案 0 :(得分:0)
排序键不支持“ IN”,仅FilterExpression支持
因此您可以查询objectId =:v_objectId,然后进行过滤
{
"TableName": "tpl_name",
"KeyConditionExpression": " objectId = :objectId_value ",
"FilterExpression": "( annotationIdVersion IN (:v1,:v2,:v3 ) )",
"ExpressionAttributeValues": {
":objectId_value": {
"S": "myobjid"
},
":v1": {
"S": "a"
},
":v2": {
"S": "b"
},
":v3": {
"S": "c"
}
}
}
答案 1 :(得分:0)
不,您不能这样做。参见documentation for condition expressions。
页面顶部的相关语法为:
condition-expression ::=
operand IN ( operand (',' operand (, ...) ))
其中 operand 被定义为顶级属性名称,或者是引用嵌套属性的文档路径。换句话说,仅支持属性,而不支持begins_with
之类的功能。