簡體   English   中英

Dynamo DB 僅通過傳遞 javascript object 更新語法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM