使用 node.js 使用嵌套对象有条件地更新 dynamoDB

Conditional update to dynamoDB with nested object using node.js

我正在尝试更新数据库 table 中的 3 个嵌套项,我的 lambda 运行良好并且没有给出任何错误,但是当查询 table 它不显示新值时,我不确定我是在调用 table 还是正确传递参数

我的分区 key/primary 键是 badgeNumber

我的 dynamoDB table 看起来像这样: (我要更新的项目是 date,hour,registeryyy-mm-dd,hh-mm-ss and true

{
  "assistance": [
    {
      "date": "null",
      "hour": "null",
      "register": false
    }
  ],
  "badgeNumber": "0000",
  "data": {
    "cardType": "elem",
    "firstName": "Moriuks",
    "imageURL": "url",
    "lastName": "Mora",
    "position": "Student"
  }
}

更新项目的条件是如果寄存器=false然后将新值写入table。

我的代码是这样的 pppp

var updateAsisstance = function(day,hour,id){
            var docClient = new AWS.DynamoDB.DocumentClient();

            var params = {
            TableName:"someTable",
            Key: { badgeNumber : 0000 },
            UpdateExpression: "SET #asi[0].#reg  = :locVal",
            ExpressionAttributeNames: {
              '#asi': 'asisstance',
              '#reg': 'register',
            },
            ConditionExpression: "NE(#asi[0].#reg:true)",
            ExpressionAttributeValues:{
                ":date":day,
                ":hour":hour,
                ":locVal":true
            },
            ReturnValues:"UPDATED_NEW"
        };
            docClient.update(params, function(err, data) {
          if (err) {
            console.log("Error", err);
          } else {
            console.log("Success", data);
          }
        });

        };

定义函数后,我将使用

调用它
updateAssistance(day,hour,id)

预期输出应如下所示:

  "assistance": [
    {
      "date": "yyyy-MM-DD",
      "hour": "HH-MM-SS",
      "register": true
    }
  ],

我通过更改代码解决了它,另外,我的条件表达式是错误的...这是它的样子。

'use strict';
const AWS = require('aws-sdk');

var today = new Date();
var date = today.getFullYear()+'-'+(today.getMonth()+1)+'-'+today.getDate();
var hour = (today.getHours()-5) + ":" + today.getMinutes() + ":" + today.getSeconds();

exports.handler = async (event,context) => {

    const documentClient = new AWS.DynamoDB.DocumentClient();
    let responseBody = "";
    let statusCode = 0;

    var params = {
    TableName:"SomeTable",
    Key: { badgeNumber : '0000' },
    UpdateExpression: "set assistance[0].register = :n,assistencia[0].date = :date,assistencia[0].hour = :hour",
    ExpressionAttributeNames: {
      '#asi': 'assistance',
      '#reg': 'register'
    },
    ConditionExpression: "(#asi[0].#reg = :p)",
    ExpressionAttributeValues:{
        ":n":true,
        ":p":false,
        ":date":date,
        ":hour":hour
    },
    ReturnValues:"UPDATED_NEW"
    }


    try {
        const data = await documentClient.update(params).promise();
        responseBody = JSON.stringify(data);
        statusCode = 204;
    } catch (err) {
        responseBody = `Unable to update product: ${err}`;
        statusCode = 403;
    }    

    const response = {
        statusCode: statusCode,
        headers: {
            "Content-Type": "application/json"
        },
        body:responseBody
    }
    return response
}

这会更改我的 dynamoDB table 中的嵌套值,如果你没有任何它非常简单的话。