Dynamodb-插入重复检查

时间:2018-07-05 10:10:37

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

如果表中存在PhoneId = 123,我正在使用ConditionExpression来防止插入到表中。但是,这似乎不起作用,因为我得到重复的行。

注意:PhoneId不是主键。我已经创建了PhoneIdIndex索引,不确定如何将其用于ConditionExpression。

  return new Promise(function(resolve, reject) {
    var params = {
      TableName: "Phone",
      ReturnConsumedCapacity: "TOTAL",
      ConditionExpression:"#PhoneId <> :PhoneId",
      ExpressionAttributeNames: { '#PhoneId': 'PhoneId' },
      ExpressionAttributeValues: { ":PhoneId": 123 },
      Item: phoneObject
    };

    docClient.put(params, function(err, data) {
      if (err) {
        console.error(err);
        reject(err);
      } else {
        resolve(data);
      }
    });
  });

1 个答案:

答案 0 :(得分:0)

DynamoDB不支持在表级别对非关键属性进行存在的条件检查。

要解压缩该语句,您无法创建Dynamo必须在表中查询代表您要添加的项目以外的任意项目的条件。

您必须实施逻辑以自己检查是否存在,但不幸的是,原子地这样做并不容易。

您显然可以天真地检查工作流程,例如:

1)查询您在PhoneId上创建的GSI,以确保它为您要添加的PhoneId返回空结果 2)仅在结果为空时添加项目

但是以上内容容易受到竞争条件的影响,在该条件下,其他操作可能会改变上面#1和#2之间的表格,因此您将不得不发挥更大的创造力:例如,您可能会执行以下操作:

1)始终插入项目,但存储一个属性,该属性记录您进行插入的时间 2)在插入的PhoneId插入后执行查询,并将所有旧项目标记为删除 3)删除陈旧记录

该解决方案仍然不是理想的解决方案,因为它要求您对查询进行防御性编码,以解决潜在的临时重复项。