gpt4 book ai didi

node.js - dynamodb 中的预期约束以防止重复

转载 作者:搜寻专家 更新时间:2023-10-31 23:49:00 24 4
gpt4 key购买 nike

我是 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”添加为额外的 Expected 字段,但这并没有改变行为。

当我修改代码时,我确实得到了一个 ConditionalCheckFailedException,因此 ID 是固定的,而不是生成的 UUID;

var item = {
id: { S: 'Test' },
email: { S: 'my@email.com' }
};

我应该解释一下,“id”是散列键,“email”是范围键。

这种行为让我相信约束只适用于用散列键指定的记录。如果是这种情况,AWS 文档确实会非常困惑(我用粗体突出显示了让我感到困惑的地方):

If Exists is false, Amazon DynamoDB assumes that the attribute value does not exist in the table. If in fact the value does not exist, then the assumption is valid and the operation succeeds. If the value is found, despite the assumption that it does not exist, the operation fails with a ConditionalCheckFailedException.

假设文档是正确的,我一定是做错了什么?任何帮助将不胜感激!

编辑 2013-11-09

根据下面的评论,我决定改变策略。我有点不愿意使用我需要在大多数其他域对象中引用的值,这些对象不是不可变的。我现在有一个电子邮件地址表,用作用户 ID 的查找/索引表。这让我可以很容易地让用户更改他或她的电子邮件地址(我什至可以支持多个电子邮件地址)。

感谢您的帮助!

最佳答案

具有范围键的 DynamoDB 表中的项目是散列键和范围键的组合,类似于 mysql 中的 unique(id, email)。所以在你的第一种方法中,当你插入一个用户的电子邮件已经存在于表中时,你正在创建一个全新的项目,因为 uuid 是完全不同的:

1st item -> Hash key: 7f224b97-c144-4df2-bc3e-cfba69d5bc6e, Range key: my@email.com

2nd item -> Hash key: 34cc6d26-dce4-4eb4-afec-3a382d9579fc, Range key: my@email.com

所以 Expected 条件确实有效,但哈希键 7f224b97-c144-4df2-bc3e-cfba69d5bc6e 的表中没有其他项目具有 Range key = my@email.com,并且 put 项目成功。

如果真的要保证用户邮箱的唯一性,应该把它作为表的Hash key。当您想要查询用户时,它也会使您的事情变得更容易:您可能知道,要在 DynamoDB 中执行查询,您必须指定要查询的哈希键的确切值,如果您不知道该值对于您要查找的哈希键,您将必须执行表扫描(效率低得多)。

因此,如果您使用 uuid 作为哈希键,则必须使用表扫描来检索您的用户(我假设您不知道与要从 DB 检索的用户关联的 uuid)。如果您使用用户邮件作为哈希键,您将能够使用查询来检索它们。

希望对您有所帮助!

关于node.js - dynamodb 中的预期约束以防止重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19806688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com