【问题标题】:NodeJS lambda dynamoDB putItem only if primary sort key is differentNodeJS lambda dynamoDB putItem 仅当主排序键不同时
【发布时间】:2018-11-02 13:05:50
【问题描述】:

我正在开发一个 lambda 函数,该函数将存储有关不同用户的信息。 我有一个属性,userID 作为我的主分区键,并且 storedObject 作为我的主排序键。 当我使用 PutItem 时,我希望它仅在存储对象属性中不存在该项目时添加它。

这是我的代码

    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 succeeded 输出到控制台。我已经尝试过 if (data) 和 if (!data) 并且即使没有返回数据,也都成功返回了获取项目。

【问题讨论】:

  • console.log('Get item succeeded', data); 后面有一个额外的右大括号,但不确定它是如何正常运行的。
  • 我在上面省略了一些 ... 所在的代码

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


【解决方案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);
    }
});

【讨论】:

  • 'if (!data.length)' 不起作用,但是 conditionExpression 没关系,正如你所说的那样,这是更好的方法。感谢您的帮助。
猜你喜欢
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 2018-05-04
  • 1970-01-01
相关资源
最近更新 更多