【问题标题】:How to update JSONArray on dynamodb? (JAVA SDK)如何在 dynamodb 上更新 JSONArray? (JAVA SDK)
【发布时间】:2019-04-04 16:38:46
【问题描述】:

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

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    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,但我也失败了

    【讨论】:

      【解决方案2】:

      老实说,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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        • 1970-01-01
        相关资源
        最近更新 更多