【问题标题】:How to update a nested object inside an array in DynamoDB如何更新 DynamoDB 中数组内的嵌套对象
【发布时间】:2018-01-11 16:58:52
【问题描述】:

考虑 DynamoDB 表中的以下文档项/语法:

{
    "id": "0f00b15e-83ee-4340-99ea-6cb890830d96",
    "name": "region-1",
    "controllers": [
        {
            "id": "93014cf0-bb05-4fbb-9466-d56ff51b1d22",
            "routes": [
                {
                    "direction": "N",
                    "cars": 0,
                    "sensors": [
                        {
                            "id": "e82c45a3-d356-41e4-977e-f7ec947aad46",
                            "light": true,
                        },
                        {
                            "id": "78a6883e-1ced-4727-9c94-2154e0eb6139",
                        }
                    ]
                }
            ]
        }
    ]
}

我的目标是更新此 JSON 表示中的单个属性,在本例中为 cars

我的方法

我知道所有传感器的 ID。因此,获得该属性的最简单方法是在数组中找到具有任何 id 的传感器的路线。找到该传感器后,Dynamo 应该知道他必须更新路由数组中的哪个对象。但是,如果我的条件被拒绝,我将无法运行此代码。

在这种情况下,更新属性汽车,其中路线有一个 ID 为 e82c45a3-d356-41e4-977e-f7ec947aad4678a6883e-1ced-4727-9c94-2154e0eb6139 的传感器。

var params = {
    TableName: table,
    Key:{
        "id": "0f00b15e-83ee-4340-99ea-6cb890830d96",
        "name": "region-1"
    },
    UpdateExpression: "set controllers.intersections.routes.cars = :c",
    ConditionExpression: ""controllers.intersections.routes.sensors.id = :s",
    ExpressionAttributeValues:{
    ":c": 1,
    ":s": "e82c45a3-d356-41e4-977e-f7ec947aad46"
    },
    ReturnValues:"UPDATED_NEW"
};

docClient.update(params, ...); 

我怎样才能做到这一点?

【问题讨论】:

标签: amazon-dynamodb


【解决方案1】:
TableName : 'tablename',
Key : { id: id},
ReturnValues : 'ALL_NEW',
UpdateExpression : 'set someitem['+`index`+'].somevalue = :reply_content', 
ExpressionAttributeValues : { ':reply_content' : updateddata }

为了更新嵌套数组元素需要找出数组索引。然后您可以更新 dynamo db 中的嵌套数组元素。

【讨论】:

  • 我还建议添加条件表达式以避免竞争条件
  • 我使用过类似'set someitem['+`index`+'].somevalue = :reply_content', 的东西,我收到错误"Invalid UpdateExpression: Syntax error; token: \"'\", near: \"['+\"" 任何帮助谢谢
  • 工作案例'set someitem['+index+'].somevalue = :reply_content'
【解决方案2】:

不幸的是,您无法在不知道数组索引的情况下在 DynamoDB 中实现这一点。你有非常复杂的嵌套结构。 DynamoDB API 没有处理这种情况的功能。

我认为您需要控制器、路由和传感器的数组索引才能使更新正常工作。

您的方法可能适用于 MongoDB 等其他数据库。但是,它不适用于 DynamoDB。一般来说,不建议在 DynamoDB 中使用这种复杂的结构,特别是如果您的用例有更新场景。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2021-02-06
    • 2023-01-12
    相关资源
    最近更新 更多