如果表中存在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);
}
});
});
答案 0 :(得分:0)
DynamoDB不支持在表级别对非关键属性进行存在的条件检查。
要解压缩该语句,您无法创建Dynamo必须在表中查询代表您要添加的项目以外的任意项目的条件。
您必须实施逻辑以自己检查是否存在,但不幸的是,原子地这样做并不容易。
您显然可以天真地检查工作流程,例如:
1)查询您在PhoneId上创建的GSI,以确保它为您要添加的PhoneId返回空结果 2)仅在结果为空时添加项目
但是以上内容容易受到竞争条件的影响,在该条件下,其他操作可能会改变上面#1和#2之间的表格,因此您将不得不发挥更大的创造力:例如,您可能会执行以下操作:
1)始终插入项目,但存储一个属性,该属性记录您进行插入的时间 2)在插入的PhoneId插入后执行查询,并将所有旧项目标记为删除 3)删除陈旧记录
该解决方案仍然不是理想的解决方案,因为它要求您对查询进行防御性编码,以解决潜在的临时重复项。