如何在dynamodb中更新地图属性



我在dynamo中有一个具有以下结构的地图:

participants: {
M: {
"6ecd8c99-4036-403d-bf84-cf8400f67836": {
M: {
participantUid: {
S: "6ecd8c99-4036-403d-bf84-cf8400f67836",
},
userSummary: {
M: {
userRef: {
S: "refGoesHere",
},
},
},
isRead: {
BOOL: false,
},
},
},
},
},

我正在尝试使用以下命令更新isRead属性:

const updateReadStatusCommand = new UpdateCommand({
TableName: config.database,
Key: {
PK: `TASK#${taskUid}#CLIENT#${client}`,
SK: `THREAD#${uid}`,
},
UpdateExpression: `SET participants.#participantUid.isRead = :isRead`,
ExpressionAttributeNames: {
"#participantUid": userUid,
},
ExpressionAttributeValues: {
":isRead": updateBody.isRead,
},
ReturnValues: "ALL_NEW",
});

到目前为止,我一直遇到以下错误:The document path provided in the update expression is invalid for update

我很难在这里看到这个问题,因为它不会识别地图中的房产。有人能给我指正确的方向吗?

编辑:

我还扫描了表格,以确保数据的格式正确,它看起来像这样:

"participants": {
"6ecd8c99-4036-403d-bf84-cf8400f67836": {
"isRead": false,
"participantUid": "6ecd8c99-4036-403d-bf84-cf8400f67836",
"userSummary": {
"userRef": "refGoesHere"
}
}
},

我认为这没什么错,我能想到的唯一一件事就是尝试改变

UpdateExpression: `SET participants.#participantUid.isRead = :isRead`,
ExpressionAttributeNames: {
"#participantUid": userUid,
},
...

UpdateExpression: `SET participants.#participantUid.#isRead = :isRead`,
ExpressionAttributeNames: {
"#participantUid": userUid,
"#isRead": "isRead"
},
...

如果.isRead被视为字符串,而不是路径的一部分,正如我在文档中注意到的,就像下面的例子一样,使用#3str作为#pr.#3star,而不是直接使用#pr.ThreeStar-

aws dynamodb update-item 
--table-name ProductCatalog 
--key '{"Id":{"N":"789"}}' 
--update-expression "SET #pr.#5star[1] = :r5, #pr.#3star = :r3" 
--expression-attribute-names file://names.json 
--expression-attribute-values file://values.json 
--return-values ALL_NEW

(names.json(

{
"#pr": "ProductReviews",
"#5star": "FiveStar",
"#3star": "ThreeStar"
}

解决了由于SK不正确导致的问题,这意味着找不到我想要更新的文档。

查询本身是正确的。把这个留给任何处于类似位置的人,检查一下你是否真的在尝试更新正确的东西!

最新更新