如何在dynamodb上更新JSONArray? (JAVA SDK)

时间:2016-04-27 03:18:33

标签: amazon-dynamodb

我在dynamodb上有一个JSONObject存储,如下所示,

"info" :  {
        "nn": {
            "nnn": [{
                "nnnn": "bb"
            }]
        },
        "ln": "zheng1",
        "fn": "franky",
        "sn": [{
            "aa": "zheng2"
        }]
    }

我想通过UpdateItemSpec更新info.sn

    List<JSONObject> li= new ArrayList<JSONObject>();
    JSONObject j = new JSONObject();
    j.append("kk","kkkk");
    li.add(j);

UpdateItemSpec updateItemSpec = new UpdateItemSpec()
        .withPrimaryKey("Age", age, "Name", name)
        .withExpressionSpec(new ExpressionSpecBuilder()
                    .addUpdate(ExpressionSpecBuilder.S("phone").set("0900000222"))
                    .addUpdate(ExpressionSpecBuilder.S("info.ln").set("zheng32"))
                    .addUpdate(ExpressionSpecBuilder.list_append("info.sn", li))  // ERRO
                    .withCondition(ExpressionSpecBuilder.N("weight").eq(82))
                    .buildForUpdate())
        .withReturnValues(ReturnValue.UPDATED_NEW);

错误将是list_append,我找不到更新JSONArray的方法,有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

This answer应该会有所帮助。因此,您的更新项目规范可能如下所示

UpdateItemSpec updateItemSpec = new UpdateItemSpec()
            .withPrimaryKey("Age", age, "Name", name)
            .withNameMap(new NameMap().with("#P", "info.sn"))
            .withValueMap(new ValueMap()
                    .withList(":val", li) //list of map
                    .withList(":empty_list", new ArrayList<>()))
            .withUpdateExpression("SET #P = list_append(if_not_exists(#P, :empty_list), :val)");

我最初尝试使用ExpressionSpecBuilder,但我也失败了

答案 1 :(得分:0)

老实说,Java客户端是Java反模式的纪念碑。

这是使用ExpressionSpecBuilder样式的list_append的示例。

final UpdateItemExpressionSpec xspec = new ExpressionSpecBuilder()
        .addUpdate(
                ExpressionSpecBuilder.L("log")
                .set(ExpressionSpecBuilder.L("log") // yes you have to repeat the column name
                .listAppend(value)))
        .buildForUpdate();

final UpdateItemOutcome updateItemOutcome = table.updateItem("Id", id, xspec);