我是 DynamoDB 的新手,无法让以下场景在 node.js 和 DynamoDB 中工作:
我想在用户表中插入一个用户,但如果用户的电子邮件地址已经存在,我不希望它成功。
以下代码能够成功插入新用户:
var item = {
id: { S: uuid.v4()},
email: { S: 'my@email.com' }
};
dynamodb.putItem({
TableName: 'user',
Item: item,
Expected: {
email: { Exists: false }
}
}, function (err, data) {
if (err) {
return callback(err);
}
callback();
});
我假设 Expected 值会通过引发 ConditionalCheckFailedException 错误来防止用户表中出现重复的电子邮件地址。不是这种情况; 上面的代码将一致地插入重复的电子邮件。我尝试将“id”添加为额外的预期字段,但这并没有改变行为。
当我修改代码时,我确实得到了 ConditionalCheckFailedException,因此 ID 是固定的,而不是生成的 UUID;
var item = {
id: { S: 'Test' },
email: { S: 'my@email.com' }
};
我应该解释一下,“id”是哈希键,“email”是范围键。
这种行为使我相信约束仅适用于使用散列键指定的记录。如果是这种情况,AWS 文档确实会非常混乱(我用粗体突出了让我感到困惑的地方):
如果 Exists 为 false,则 Amazon DynamoDB 假定该属性值在表中不存在。如果实际上该值不存在,则假设有效并且操作成功。如果找到该值,尽管假设它不存在,操作将失败并出现 ConditionalCheckFailedException。
假设文档是正确的,我一定做错了什么?任何帮助将非常感激!
编辑 2013-11-09
根据下面的评论,我决定改变策略。我有点不愿意在大多数其他非不可变的域对象中使用我需要引用的值。我现在有一个电子邮件地址表,用作用户 ID 的查找/索引表。这让我可以很容易地让用户更改他或她的电子邮件地址(我什至可以支持多个电子邮件地址)。
谢谢您的帮助!