通过对排序键执行IN操作(begins_with(condition-expression))查询dynamoDB

时间:2019-02-19 23:44:09

标签: java amazon-dynamodb

我正在查询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函数。我正在寻找有关实现上述用例的任何建议。

任何建议将不胜感激。提前致谢。

2 个答案:

答案 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之类的功能。