[英]Dynamo DB update syntax by just passing javascript object
是否有一種簡單的方法可以通過將屬性作為 javascript object 傳遞來更新多個屬性。更新數據庫中的所有 object 鍵值,如果{a: 1, b: { c:1 } }
,只需將屬性a with 1
,屬性b 與{c:1}
const docClient = new AWS.DynamoDB.DocumentClient({ region: "us-east-2" });
const PK = (userId) => `USER#${userId}`;
const SK = (file) => `FILE#${file}`;
const updateFn = async (tableName, { pk, sk }, attributes) => {
const updateExpr = Object.keys(attributes)
.map((key) => `${key} = :${key}`)
.join(",");
const exprAttVal = Object.fromEntries(
Object.entries(attributes).map(([key, val]) => [`:${key}`, val])
);
const params = {
Key: { pk: PK(`${pk}`), sk: SK(`${sk}`) },
UpdateExpression: "SET " + updateExpr,
ExpressionAttributeValues: exprAttVal,
};
try {
const records = await docClient
.update({
TableName: tableName,
...params,
})
.promise();
console.log("records", records);
return records;
} catch (err) {
console.log("error", err);
return null;
}
};
const TABLE_NAME = "FileTracker";
updateFn(
TABLE_NAME,
{ pk: "pk", sk: "sk" },
{
score: 32,
level: "1b2",
foobar: "bla-bla",
}
);
上面的代碼適用於簡單的屬性,如{a: 1}
等。
但是,如果有 map like { stats:{ success: 1, failure: { reason: 'bla', count: 2} } }
上面的代碼將不起作用,因為在更新表達式格式中應該是值SET stats.success =:stats.success, stats.failure.reason =:stats.failure.reason
ExpressionAttributeValues = { ':stats.success': 2, 'stats.failure.reason': 'foo-reason' }
注意:stats.failure.reason
不是有效的屬性值占位符。
只是想知道是否已經有適用於這種情況的代碼?
在調用updateFn
之前,您需要flatten
您的屬性。
檢查這將幫助您將 map object 弄平。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.