繁体   English   中英

不使用 Key 属性的 DynamoDB 更新操作

[英]DynamoDB Update operation without using the Key attribute

用例:我有一个投标表,其中包含对 Loades 的投标。 一个负载可以有多个投标。 每次出价的出价状态都是新的。 一旦管理员接受了投标(提出该负载进行投标的人),那么我需要将该特定投标的状态更改为“已接受”,而对于同一负载上的其他投标,状态应为“拒绝”。

表定义:Bid_id(每条记录都是唯一的)和 Load_id(多个条目)分别是我的主键和排序键。

如何处理表的非键属性的更新?

table.update_item(
            Key={
                'load_id': load_id,
                'bid_id' : bid_id
                },
            ConditionExpression=(
                        'load_id = :id'
                        
                ),
            
            UpdateExpression='SET #attr1 = :val1',
            ExpressionAttributeValues={':val1': status, ':id': id},
            ExpressionAttributeNames={'#attr1': 'status'},
            
            ReturnValues='UPDATED_NEW'
        )

注意:Status 和 id 的值是从事件体中读取的。

显然,上面的代码仅在我需要将被接受的投标状态更改为“接受”时才有效。 我正在考虑如何处理同一负载下其他投标的“拒绝”状态。

谁能帮我解决这个问题?

我不相信 DDB 中有批量更新选项。 您可能对事务有一些运气,它确实允许更新,但会带来额外的开销。 或者,您可能需要考虑使用稀疏索引来解决此问题。

例如,假设您的主表具有以下出价信息

投标表

假设您想将 BID#1 标记为已接受的出价。 您可以在接受的投标上创建一个全局二级索引,而不是引入一个属性来定义接受/拒绝状态。 例如

在此处输入图像描述

在此示例中,我创建了一个名为 GSIPK 的附加属性(您可以将其命名为任何名称,这只是一个示例)。 从逻辑上讲,您的索引将如下所示:

在此处输入图像描述

请注意,该索引包含来自 LOAD#1 的中标。 没有其他出价在索引中,因为没有其他出价项具有 GSIPK 属性。

这可能无法满足您围绕出价的所有访问模式。 但是,将中标与拒绝的出价区分开来,而无需对属性进行批量更新,这是一种不错的策略。

如果您确实想创建一个可以设置为拒绝/接受状态的status属性,您可以考虑在插入投标时将默认状态设置为rejected 这样,您只需在出价完成后更新单个接受的出价。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM