仅当主排序键不同时,NodeJS lambda dynamoDB putItem

时间:2018-11-01 18:33:50

标签: node.js aws-lambda amazon-dynamodb

我正在使用lambda函数,该函数将存储有关不同用户的信息。 我有一个属性,用户ID是我的主分区键,而storedObject是我的主排序键。 当我使用PutItem时,我希望它仅在storedObject属性中尚不存在的情况下添加该项目。

这是我的代码

    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 :(得分:1)

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);
    }
});