DynamoDB - 如果哈希键(或哈希键和范围键的组合)不存在,则添加项目
DynamoDB - 如果哈希键(或哈希键和范围键的组合)不存在,则添加项目
以下是我的用例:我有一个带有哈希和范围键的Dynamo表。当我将新项放入表中时,我想进行唯一性检查。有时我希望保证哈希是唯一的(忽略范围)。其他时候,我希望允许重复的哈希,但保证哈希和范围组合是唯一的。我该如何实现这一点?
我尝试过attribute_not_exists。它似乎处理第二种情况,即检查哈希+键组合。这是一个PHP示例:
$client->putItem(array( 'TableName' => 'test', 'Item' => array( 'hash' => array('S' => 'abcdefg'), 'range' => array('S' => 'some other value'), 'whatever' => array('N' => 233) ), 'ConditionExpression' => 'attribute_not_exists(hash)' ));
奇怪的是,使用attribute_not_exists(hash)还是attribute_not_exists(range)似乎没有影响。它们似乎做的事情完全相同。这是预期的工作方式吗?
有没有办法处理我只想检查哈希的唯一性的情况?
DynamoDB - Put item if hash (or hash and range combination) doesn't exist
DynamoDB是亚马逊提供的一种NoSQL数据库服务,它具有快速、可扩展和全管理的特点。在使用DynamoDB的过程中,有时需要判断某个特定的键是否已经存在,如果不存在则执行某些操作,例如插入新的数据。本文将讨论在DynamoDB中如何使用PutItem方法来判断哈希键(或哈希键和范围键组合)是否存在的问题以及解决方法。
首先,需要注意的是DynamoDB中有一些保留关键字,当提供的属性名称与保留列表中的单词匹配时,attribute_not_exists函数的行为将不如预期。在这种情况下,哈希键和范围键都是保留关键字,因此需要通过使用ExpressionAttributeNames来解决这个问题。
下面是一个示例代码,它允许重复的分区键,并且只有在表中已经存在具有提供的分区键和排序键的项时才会失败。
$client->putItem(array( 'TableName' => 'test', 'Item' => array( 'hash' => array('S' => 'abcdefg'), 'range' => array('S' => 'some other value'), 'whatever' => array('N' => 233) ), 'ConditionExpression' => 'attribute_not_exists(#h) AND attribute_not_exists(#r)', 'ExpressionAttributeNames' => array('#h' => 'hash', '#r' => 'range') ));
另一个示例代码可以确保名为“hash”的分区键是唯一的。
$client->putItem( 'TableName' => 'test', 'Item' => array( 'hash' => array('S' => 'abcdefg'), 'range' => array('S' => 'some other value'), 'whatever' => array('N' => 233) ), 'ConditionExpression' => 'attribute_not_exists(#h)', 'ExpressionAttributeNames' => array('#h' => 'hash') );
通过使用上述示例代码中的ConditionExpression和ExpressionAttributeNames,可以在执行PutItem操作时判断特定的键是否已经存在,从而避免重复插入数据。
总结起来,DynamoDB中的PutItem方法可以通过条件表达式和属性名称映射来判断哈希键(或哈希键和范围键组合)是否存在。通过使用attribute_not_exists函数和ExpressionAttributeNames,可以避免保留关键字导致的问题,确保数据的唯一性和完整性。
DynamoDB - Put item if hash (or hash and range combination) doesn't exist
在使用DynamoDB的PutItem操作时,我们可能需要检查某个特定的项是否已经存在,如果不存在则执行插入操作。这个问题的出现是因为DynamoDB提供了attribute_not_exists函数来进行条件判断,然而其使用方式和文档中的描述存在一些不一致。
首先,attribute_not_exists函数中的attribute指的是在表中已存在的某个项的属性。而需要判断是否存在的是待插入项的主键(或分区键、范围键)。
其次,attribute_not_exists函数的判断是针对具有相同主键的已存在项进行的。也就是说,它会检查和待插入项具有相同主键的项是否存在。
因此,如果我们只想防止覆盖已存在的项,可以使用attribute_not_exists函数与主键(或分区键、范围键)一起使用。由于主键必须存在,判断(b)始终会通过,只有判断(a)会生效。
总结一下,DynamoDB中的attribute_not_exists函数实际上是用来检查具有相同主键的项是否存在的。它可以用于防止覆盖已存在的项,只要将它与主键(或分区键、范围键)一起使用即可。
虽然DynamoDB文档中提到了这个特性,但是没有给出详细的说明。这导致了很多用户对这个函数的使用存在困惑。因此,在使用attribute_not_exists函数时,需要注意其实际的判断对象是具有相同主键的项。
参考链接:[https://theaws.blog/dynamodb-nodejs-sdk-by-examples/](https://theaws.blog/dynamodb-nodejs-sdk-by-examples/)
感谢这位开发者的澄清,文档让我对它的作用非常困惑。对我来说,关键的信息是“它检查的是哪个项”。对于PutItem操作,条件表达式的唯一用途就是决定是否覆盖具有相同主键的已存在项。是这样吗?
没错,只有在没有这样的项存在时,条件表达式的判断结果才会为true。
DynamoDB - Put item if hash (or hash and range combination) doesn't exist
在DynamoDB中,无法直接通过hash或hash+range(取决于表的设置)来判断项是否存在。每个项都有一个hash和一个range键,必须同时提供这两个键来进行PutItem操作。可以通过在ConditionExpression中使用attribute_not_exists函数来判断hash或range属性是否存在,但该函数只检查属性是否存在,不关心属性的值。
下面是一个例子,假设有一个hash+range键的表,其中包含以下数据:
1. hash=A,range=1
2. hash=A,range=2
根据以上数据,有以下四种情况:
1. 如果尝试插入hash=A,range=3且使用attribute_not_exists(hash)条件,PutItem操作将成功,因为attribute_not_exists(hash)的结果为true。不存在满足attribute_not_exists(hash)条件的hash=A,range=3的项。
2. 如果尝试插入hash=A,range=3且使用attribute_not_exists(range)条件,PutItem操作将成功,因为attribute_not_exists(range)的结果为true。不存在满足attribute_not_exists(range)条件的hash=A,range=3的项。
3. 如果尝试插入hash=A,range=1且使用attribute_not_exists(hash)条件,PutItem操作将失败,因为attribute_not_exists(hash)的结果为false。存在一个hash=A,range=1的项不满足attribute_not_exists(hash)条件。
4. 如果尝试插入hash=A,range=1且使用attribute_not_exists(range)条件,PutItem操作将失败,因为attribute_not_exists(range)的结果为false。存在一个hash=A,range=1的项不满足attribute_not_exists(range)条件。
根据以上情况,无论是在hash键还是range键上进行PutItem操作,结果都是一样的。hash+range键用于唯一标识表中的一个项,条件表达式的计算是在该项上进行的。
由于hash+range键的设计方式,一个hash键可以有多个range键。每个hash+range组合必须是唯一的。具体区别可以参考这个回答。
通过以上解释,可以理解为什么attribute_not_exists(hash)会同时检查hash和range。并且无法通过条件表达式只检查hash。不同的attribute_not_exists条件实际上执行相同的操作。
如果想要避免重复的hash键,即使range值不同,可以考虑使用其他方式或结合使用DynamoDB事务来实现。事务的使用可以参考DynamoDB官方文档。
总结起来,DynamoDB无法直接判断项是否存在,但可以通过条件表达式中的attribute_not_exists函数来判断属性是否存在。在使用hash+range键进行PutItem操作时,条件表达式的计算是在该项上进行的,不会影响其他项。