我在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的方法,有人可以帮忙吗?
答案 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);