考虑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应该知道他必须更新的路由数组中的哪个对象。但是,如果我的条件被拒绝,我就无法运行此代码。
在这种情况下,请更新属性汽车,其中路线的传感器标识为e82c45a3-d356-41e4-977e-f7ec947aad46
或78a6883e-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, ...);
我怎样才能做到这一点?
答案 0 :(得分:5)
不幸的是,如果不知道数组索引,就无法在DynamoDB中实现这一点。你有非常复杂的嵌套结构。 DynamoDB API没有处理此方案的功能。
我认为您需要控制器,路由和传感器的数组索引才能使更新生效。
您的方法可能适用于MongoDB等其他数据库。但是,它不适用于DynamoDB。通常,建议不要在DynamoDB中使用此复杂结构,尤其是在您的用例具有更新方案的情况下。
答案 1 :(得分:0)
TableName : 'tablename',
Key : { id: id},
ReturnValues : 'ALL_NEW',
UpdateExpression : 'set someitem['+`index`+'].somevalue = :reply_content',
ExpressionAttributeValues : { ':reply_content' : updateddata }
要更新嵌套数组元素,需要找出数组索引。然后,您可以在dynamo db中更新嵌套数组元素。