Условное обновление к DynamoDB с вложенным объектом с использованием node.js - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь обновить 3 вложенных элемента в таблице базы данных, моя лямбда работает нормально и не выдает никаких ошибок, но при запросе к таблице не отображаются новые значения, я не уверен, что я вызываю таблицуили правильно передавая аргументы

мой ключ / первичный ключ является badgeNumber

моя таблица DynamoDB выглядит следующим образом: (элементы, которые я пытаюсь обновить: date,hour,register до yyy-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, то записать новые значения в таблицу.

мой код выглядит следующим образом 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
    }
  ],

1 Ответ

0 голосов
/ 02 октября 2019

Я решил это, изменив код, также, мое выражение условия было неправильным ... вот как это выглядит.

'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, если у вас нетлюбой его довольно прямо вперед.

...