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

Amazon dynamodb 如何在dynamodb上更新JSONArray?(JAVA SDK),amazon-dynamodb,Amazon Dynamodb,我在dynamodb上有一个JSONObject存储,如下所示 "info" : { "nn": { "nnn": [{ "nnnn": "bb" }] }, "ln": "zheng1", "fn": "franky", "sn": [{ "aa": "zheng2" }] } 我想通

我在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 li=new ArrayList();
JSONObject j=新的JSONObject();
j、 附加(“kk”、“kkk”);
li.添加(j);
UpdateItemSpec UpdateItemSpec=新的UpdateItemSpec()
.withPrimaryKey(“年龄”、“年龄”、“姓名”、“姓名”)
.withExpressionSpec(新的ExpressionSpecBuilder()
.addUpdate(ExpressionSpecBuilder.S(“电话”).set(“0900000222”))
.addUpdate(ExpressionSpecBuilder.S(“info.ln”).set(“zheng32”))
.addUpdate(ExpressionSpecBuilder.list_append(“info.sn”,li))//错误
.带条件(表达式SpecBuilder.N(“重量”).eq(82))
.buildForUpdate())
.withReturnValue(ReturnValue.UPDATED\u NEW);
错误将是list\u append,我找不到更新JSONArray的方法,有人可以帮忙吗?

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

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)");
UpdateItemSpec UpdateItemSpec=new UpdateItemSpec()
.withPrimaryKey(“年龄”、“年龄”、“姓名”、“姓名”)
.withNameMap(newnamemap().with(“#P”,“info.sn”))
.withValueMap(新的ValueMap()
.withList(“:val”,li)//地图列表
.withList(“:empty_list”,new ArrayList()))
.withUpdateExpression(“SET#P=list_append(如果不存在(#P,:empty_list),:val)”;

起初我尝试使用ExpressionSpecBuilder,但也失败了。老实说,Java客户端是Java反模式的纪念碑

下面是一个使用ExpressionSpecBuilder样式的列表附加示例

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);