我在 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
正如您所指出的,要更新列表中的项目,您必须首先知道列表项目的位置。在大多数情况下,使用地图更有利,因为您也正确陈述了。
您的问题是您无法再在客户端代码中映射对象,但您可以使用以下代码简单地将映射转换为数组:
const output = Array.from(myMap).map(([key, val]) => ({key, val}));