NodeJS лямбда динамоDB putItem, только если первичный ключ сортировки отличается - PullRequest
0 голосов
/ 01 ноября 2018

Я работаю над лямбда-функцией, которая будет хранить информацию о разных пользователях. У меня есть атрибут, userID в качестве основного ключа раздела, а StoreObject - в качестве основного ключа сортировки. Когда я использую PutItem, я хочу, чтобы он добавлял элемент только в том случае, если он еще не существует в атрибуте storeObject.

Это мой код

    var params = {
        TableName: 'TrackItDB',
        Item: {
          'userID' : {S: currentUser},
          'storedObject' : {S: itemName},
          'lenderPerson' : {S: personName},
          'objectStatus' : {S: 'lent'},
          'transactionDate': {S: date},
        }
      };
....
const checkIfItemIsStoredParams = {
        Key: {
        "userID" : {
            S: currentUser
        },
        "storedObject" : {
            S: itemName
        }
    },
        TableName: "TrackItDB"
    };
.....
  dynamodb.getItem(checkIfItemIsStoredParams, function(err, data) {

        if (!data) { 
            // no match, add the item
            console.log('Item did not exist, storing to DB');
            console.log(params);
            return dynamodb.putItem(params, function(err, data) {
                if (err) {
                    console.log("Error", err);
                } else {
                    console.log("Success", data);
                }
               });
        }       
        else {
          console.log('Get item succeeded', data);   
              }
        } 
        });

Проблема, с которой я столкнулся, заключается в том, что она всегда выводит Get Item успешно на консоль, даже если нет данных. Я пробовал оба if (data) и if (! Data), и оба возвращают элемент get успешно, даже если данные не возвращаются.

1 Ответ

0 голосов
/ 02 ноября 2018

getItem возвращает массив, даже если он не находит искомый элемент. Следовательно, ваше условное утверждение всегда будет верным, поскольку вы проверяете, являются ли данные нулевыми / неопределенными. Вместо этого вам следует проверить длину данных:

if (!data.length) { // item doesn't exit
    // put new item
}

Альтернативным решением было бы упростить то, что вы пытаетесь сделать, сделав один вызов DynamoDB вместо двух. Это может быть хорошей идеей, если вы беспокоитесь о производительности или расходах на использование AWS. putItem имеет параметр ConditionExpression, который позволяет вам точно контролировать, какие элементы должны обновляться на основе указанных условий.

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html

В вашем случае это может выглядеть примерно так:

var params = {
    TableName: 'TrackItDB',
    Item: {
      'userID' : {S: currentUser},
      'storedObject' : {S: itemName},
      'lenderPerson' : {S: personName},
      'objectStatus' : {S: 'lent'},
      'transactionDate': {S: date},
    },
    ConditionExpression: 'attribute_not_exists(storedObject)'
};

dynamodb.putItem(params, function(err, data) {
    if (err) {
        console.log("Error", err);
    } else {
        console.log("Success", data);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...