当前位置: 首页 > 知识库问答 >
问题:

dynamodb-如果哈希(或哈希和范围组合)不存在,则放入项

岳正阳
2023-03-14

下面是我的用例:我有一个带有哈希+范围键的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)'
));

知道如何处理我只想检查hash唯一性的情况吗?

共有1个答案

公羊英达
2023-03-14

你不能。DynamoDB中的所有项都按其哈希哈希+范围进行索引(取决于表)。

到目前为止发生的事情的一种总结:

  • 单个哈希键可以有多个范围键。
  • 每个项都有哈希范围
  • 您正在发出putitem请求,并且必须同时提供哈希范围
  • 您在哈希范围属性名称上使用attribute_not_exists提供了条件表达式
  • attribute_not_exists条件只是检查具有该名称的属性是否存在,而不关心值
    null

有四种可能的情况:

>

  • 如果尝试使用hash=a,range=3attribute_not_exists(hash)放置项,则putitem将成功,因为attribute_not_exists(hash)计算结果为true。不存在满足attribute_not_exists(hash)条件的键hash=a,range=3项。

    如果尝试使用hash=a,range=3attribute_not_exists(range)放置项,则putitem将成功,因为attribute_not_exists(range)计算结果为true。不存在具有hash=a,range=3键的项,该项满足attribute_not_exists(range)的条件。

    如果尝试使用hash=a,range=1attribute_not_exists(hash)放置项,则putitem将失败,因为attribute_not_exists(hash)计算结果为false。存在一个具有hash=a,range=1键的项,该项不满足attribute_not_exists(hash)的条件。

    如果尝试使用hash=a,range=1attribute_not_exists(range)放置项,则putitem将失败,因为attribute_not_exists(range)计算结果为false。存在一个具有hash=a,range=1键的项,该项不满足attribute_not_exists(range)的条件。

    这意味着会发生两件事之一:

    • 数据库中存在哈希+范围对。
      • attribute_not_exists(hash)必须true
      • attribute_not_exists(range)必须true
      • attribute_not_exists(hash)必须为false
      • attribute_not_exists(range)必须false

      您实际上是在执行“如果不存在具有此哈希+范围键的项,则将该项放入”。

  •  类似资料:
    • 我必须经常在那里做两件事:1。给定一个category#域,获取所有匹配项。2.给定grouptype#groupname,获取所有匹配项。 这两种操作都相当频繁,所以我不想使用扫描。在DynamoDB中有没有一种有效的方法可以做到这一点?是否有更好的方法来设计模式(更多的表、辅助索引等)?任何建议都是有帮助的。有人建议使用全局辅助索引,但我的问题是,我能否将主表的范围键作为GSI的哈希键?我知道

    • 我有一张dynamodb桌子。 它有主分区键IdType(String)和主排序键Id(String) 由于它是哈希范围模式,IdType不是唯一的,一个键可以多次使用。我需要找到所有唯一的ID类型。 我们如何找到它?一种可能的解决方案是使用扫描和处理所有客户端来获取所有IdType,并使用我们自己的代码找到唯一的。但扫描成本很高,每次扫描只能扫描1MB的数据,因此扫描是不可行的,因为表中的数据已

    • 问题内容: 当大小超过maxthreshold值时,如何在哈希表或哈希表中进行重新哈希处理? 是否所有对都已复制到新的存储桶阵列中? 编辑: 重新哈希后,同一存储桶(位于链接列表中)中的元素会发生什么情况?我的意思是说,他们在重新哈希处理后会留在同一个桶中吗? 问题答案: 问题中的最大阈值称为负载系数。 建议负载系数约为0.75。负载因子定义为(m / n),其中n是哈希表的总大小,m是在需要增加

    • 所以,我有一个带有数组的哈希,就像这样: 我想将它们合并到一个哈希数组中,组合相应的元素。 结果应该是这样的: 知道如何有效地做到这一点吗? 请注意,真实世界的使用场景可能包含数量可变的散列键。

    • 问题内容: 在如何哈希列表?有人告诉我,我应该转换为一个元组第一,如到。 因此,第一个不能散列,而第二个可以散列。为什么*? *我并不是真正地在寻求详细的技术说明,而是在寻找一种直觉 问题答案: 主要是因为元组是不可变的。承担以下工作: 现在,当您这样做时会发生什么?您已修改字典中的键!远道而来!如果您熟悉哈希算法的工作原理,这会让您感到恐惧。另一方面,元组是绝对不变的。看起来好像是在修改元组,但

    • 我有DynamoDB的运动流。我正在通过aws KCL sdk v1.14.0进行处理。我看到下面日志中偶尔出现错误。我还注意到,对于dynamodb租约表中的所有碎片,startingHashKey始终为1,endingHashKey为0。有什么线索吗?