AWS DynamoDB 更新列表内的地图元素

问题描述 投票:0回答:1

我在 DynamoDB 中有下表:

{
    UserId: "123456",
    Orders: [
        {
            OrderId: "ORD123",
            OrderRef: "Christmas presents",
            OrderStatus: 0,
            OrderDeliveryDate: "21/12/2023",
            OrderItems: [
                {
                    ItemId: "ORD123-ITM001",
                    ItemDescription: "Socks",
                    ItemQuantity: 2,
                    ItemDeliveryDate: "21/12/2023",
                    ItemStatus: 0
                },
                {
                    ItemId: "ORD123-ITM002",
                    ItemDescription: "Tie",
                    ItemQuantity: 1,
                    ItemDeliveryDate: "21/12/2023",
                    ItemStatus
                },
            ]
        },
        {
            OrderId: "ORD456",
            OrderRef: "Birthday presents",
            OrderStatus: 0,
            OrderDeliveryDate: "23/12/2023",
            OrderItems: [
                {
                    ItemId: "ORD456-ITM001",
                    ItemDescription: "Cheese",
                    ItemQuantity: 1,
                    ItemDeliveryDate: "23/12/2023",
                    ItemStatus: 0
                },
            ]
        }
    ]
}

我希望能够将 ItemId:“ORD123-ITM001”的 ItemStatus 从 0 更新为 2。我可以使用下表中的索引号来完成此操作:

    const input = {
      TableName: tableName,
      Key: {
        UserId: user.userId,
      },
      ExpressionAttributeValues: { ":sts": 2 },
      UpdateExpression: `SET Orders[0].OrderItems[0].ItemStatus= :sts`,
      ReturnValues: "ALL_NEW",
    };
    const command = new UpdateCommand(input);
    const response = await documentClient.send(command);

这可以工作并更新值,但我更喜欢使用 ID 来进行更新,而不是使用索引。我的应用程序中的数据可能会由于不同的排序选项而发生变化,因此为了确保获得正确的索引,我必须先扫描数据库,然后执行我真的不想做的更新。有没有办法编写一个表达式来使用 ID 而不是索引来更新表?

我尝试过的替代方案是将 Orders 和 OrderItems 列表更改为映射(见下文),这对于点表示法的 ID 来说效果很好。然而,我遇到的问题是,当我的 GetCommand 从表中返回数据时,它无法与我的 NextJS 应用程序中的 .map 一起使用,因为 Orders 和 OrderItems 不再是数组。通过这种方法,有没有办法将 Orders 和 OrderItems 转换为数组?

{
  UserId: "123456",
  Orders: {
    ORD123: {
      OrderRef: "Christmas presents",
      OrderStatus: 0,
      OrderDeliveryDate: "21/12/2023",
      OrderItems: {
        ORD123_ITM001: {
          ItemDescription: "Socks",
          ItemQuantity: 2,
          ItemDeliveryDate: "21/12/2023",
          ItemStatus: 0,
        },
        ORD123_ITM002: {
          ItemDescription: "Tie",
          ItemQuantity: 1,
          ItemDeliveryDate: "21/12/2023",
          ItemStatus,
        },
      },
    },
    ORD456: {
      OrderRef: "Birthday presents",
      OrderStatus: 0,
      OrderDeliveryDate: "23/12/2023",
      OrderItems: {
        ORD456_ITM001: {
          ItemDescription: "Cheese",
          ItemQuantity: 1,
          ItemDeliveryDate: "23/12/2023",
          ItemStatus: 0,
        },
      },
    },
  },
}

还有其他人遇到过这个问题吗?如果有,你是如何克服的? TIA

next.js amazon-dynamodb
1个回答
0
投票

正如您所指出的,要更新列表中的项目,您必须首先知道列表项目的位置。在大多数情况下,使用地图更有利,因为您也正确陈述了。

您的问题是您无法再在客户端代码中映射对象,但您可以使用以下代码简单地将映射转换为数组:

const output = Array.from(myMap).map(([key, val]) => ({key, val}));

© www.soinside.com 2019 - 2024. All rights reserved.