Amazon web services DynamoDB更新JSON

Amazon web services DynamoDB更新JSON,amazon-web-services,amazon-dynamodb,aws-sdk,Amazon Web Services,Amazon Dynamodb,Aws Sdk,我有一张dynamodb桌子,背着一辆购物车。架构是CartKey,然后是包含CartItemId的映射列表。是否有方法根据CartKey和CartItemId更新嵌套在地图列表中的购物车项目 谢谢我正在寻找解决同一问题的方法。不幸的是,我认为没有 在成熟的基于文档的数据库(如MongoDB)中,您应该能够指定查询的索引,但DynamoDB不支持这一点 下一个最好的方法是使用整个CartItems数组查询Cart文档,对其进行迭代以找到CartItem的索引,并执行条件写入。例如:更新文档并将C

我有一张dynamodb桌子,背着一辆购物车。架构是CartKey,然后是包含CartItemId的映射列表。是否有方法根据CartKey和CartItemId更新嵌套在地图列表中的购物车项目


谢谢

我正在寻找解决同一问题的方法。不幸的是,我认为没有

在成熟的基于文档的数据库(如MongoDB)中,您应该能够指定查询的索引,但DynamoDB不支持这一点

下一个最好的方法是使用整个CartItems数组查询Cart文档,对其进行迭代以找到CartItem的索引,并执行条件写入。例如:更新文档并将CartItems[7]。仅当CartItems[7]。ProductId为WSK-1234时,数量设置为4


是的,您需要先读后写,并执行一些客户端搜索,但至少可以确保您没有更新错误的项目。

我会将您的数据模型从地图列表更改为键为CartItemId的地图

示例文件:

{ 
  CartKey : 'Cart-123',
  items : : {
    CartItemId1 : { quantity : 1, productId: "pid-123" },
    CartItemId2 : { quantity : 4, productId: "pid-987" }
  }
}
然后,您可以对特定项目执行更新表达式

UpdateExpression: "set items.CartItemId1.quantity = 2"

我用一张地图做了类似的事情,这对我很有用。希望这会有帮助

$RegID = "abracadabra";
$tableName="DefaultDelivery";
$marshaler = new Marshaler();

$requested_delivery = '{"Packet0":{"PacketNo":"2","Quantity":"1000ml","Type":"Toned Milk"},"Packet2":{"PacketNo":"4","Quantity":"250ml","Type":"Toned Milk"}}';

$eav = $marshaler->marshalJson('
{
 ":RequestedDelivery" : '.$requested_delivery.'
}
');

$key = $marshaler->marshalJson('                                               
     {                                                                          
         "RegistrationID" : "'.$RegID.'"
     }                                                                          
');

$params = [
     'TableName' => "$tableName",
     'Key' => $key,
     'ExpressionAttributeValues' => $eav,
     'UpdateExpression' => 'SET RequestedDelivery = :RequestedDelivery',
     'ReturnValues' => 'UPDATED_NEW'
];

try {
    $result = $client->updateItem($params);
        echo "SUCCESS";
}
catch (DynamoDbException $e){
   echo "Unable to update Item : \n";
}

请提供一个例子和您尝试过的内容。