DynamoDB - 如果哈希(或哈希和范围组合)不存在则放置项目

2024-06-21

以下是我的用例:我有一个带有哈希+范围键的 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) or attribute_not_exists(range)。他们似乎都在做同样的事情。这是它应该如何工作的吗?

知道如何处理我只想检查的情况hash为了独特性?


你不能。 DynamoDB 中的所有项目均按其索引hash or hash+range(取决于您的桌子)。

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

  • 单个哈希键可以有多个范围键。
  • 每个项目都有一个hash and a range key
  • 你正在制作一个PutItem请求和must提供两个hash and range
  • 您正在提供一个ConditionExpression with attribute_not_exists在任一hash or range属性名称
  • The attribute_not_exists条件只是检查具有该名称的属性是否存在,它不关心值

让我们来看一个例子。让我们从一个hash+range包含此数据的关键表:

  1. hash=A,range=1
  2. hash=A,range=2

有四种可能的情况:

  1. 如果您尝试将一个项目与hash=A,range=3 and attribute_not_exists(hash), the PutItem会成功,因为attribute_not_exists(hash)评估为true。不存在带有密钥的项目hash=A,range=3满足条件attribute_not_exists(hash).

  2. 如果您尝试将一个项目与hash=A,range=3 and attribute_not_exists(range), the PutItem会成功,因为attribute_not_exists(range)评估为true。不存在带有密钥的项目hash=A,range=3满足条件attribute_not_exists(range).

  3. 如果您尝试将一个项目与hash=A,range=1 and attribute_not_exists(hash), the PutItem会失败,因为attribute_not_exists(hash)评估为false。存在带有键的项目hash=A,range=1则不满足条件attribute_not_exists(hash).

  4. 如果您尝试将一个项目与hash=A,range=1 and attribute_not_exists(range), the PutItem会失败,因为attribute_not_exists(range)评估为false。存在带有键的项目hash=A,range=1则不满足条件attribute_not_exists(range).

这意味着将会发生以下两种情况之一:

  1. The hash+range pair exists in the database.
    • attribute_not_exists(hash)必须是true
    • attribute_not_exists(range)必须是true
  2. The hash+range pair does not exist in the database.
    • attribute_not_exists(hash)必须是false
    • attribute_not_exists(range)必须是false

在这两种情况下,无论将其放在散列键还是范围键上,都会得到相同的结果。这hash+range键标识整个表中的单个项目,并且正在根据该项目评估您的条件。

您正在有效地执行“如果有此项目,则放置此项目hash+range密钥尚不存在”.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DynamoDB - 如果哈希(或哈希和范围组合)不存在则放置项目 的相关文章

随机推荐

  • Spring Rest POST Json RequestBody 不支持内容类型

    当我尝试使用 post 方法发布新对象时 RequestBody 无法识别 contentType Spring 已经配置完毕 POST 可以与其他对象一起使用 但不能与这个特定对象一起使用 org springframework web
  • NHibernate 二级缓存 - 驱逐区域

    我们在 nHibernate 实现中设置了许多缓存区域 为了避免负载平衡 Web 服务器出现问题 我想有效地禁用编辑缓存数据的页面上的缓存 我可以编写一个方法来轻松清除所有查询缓存 类缓存和实体缓存 但我真正想要的是按区域清除缓存 sess
  • WPF 媒体格式

    WPF 是否内置对任何音频和视频格式的支持 我将使用 MediaPlayer 和 MediaElement 类来构建一个小型媒体播放器 目前 我不想处理 NET 没有本机支持的编解码器和格式 WPF 默认支持视频格式 WMV MPEG 和一
  • 未捕获的类型错误:this.props.signinUser 不是一个函数(…)

    src actions index js import axios from axios const ROOT URL http localhost 3090 export function signinUser email passwor
  • 如何在 iOS 7 中刷新 UICollectionViewCell?

    我正在尝试在 Xcode 5 中开发我的应用程序并在 iOS 7 环境下调试它 我有一个自定义的 UICollectionViewLayoutAttributes 我打算在长按 UICollectionViewCell 后执行一些操作 因此
  • 如何从表中选择所有偶数 id?

    我想从 MySQL 数据库的表中选择所有甚至帖子 ID 然后显示它们 我还想获取所有带有奇怪 id 的帖子并将它们显示在其他地方 我想使用 PHP 来完成此操作 因为这是我使用的服务器端语言 或者 我是否必须选择所有帖子 然后使用 Java
  • 防止在 Razor 页面中自动传递 URL 参数

    我正在为 Web 应用程序使用 NET Core 2 Razor Pages 格式 它允许您使用顶部的简单指令定义如何将 URL 映射到变量名称 page personId int 例如 上面的内容将映射 URL Person Index
  • Selenium RemoteWebDriver:与 selenium-standalone-server 的连接失败(驱动程序版本未知)

    在用 Java 编写的应用程序测试中尝试使用 RemoteWebDriver 设置与 selenium server standalone 的连接后 我收到了异常 该问题与使用 maven 启动 selenium server standa
  • 零作为 IIFE 中的第一个参数[重复]

    这个问题在这里已经有答案了 In babeljs v6 5 1 class Foo 编译为 use strict var classCallCheck2 require babel runtime helpers classCallChec
  • Python:记录垃圾收集器

    我有一个 python 应用程序 有一些性能问题 我想将垃圾收集器的事件 特别是何时调用 添加到我的日志中 是否可以 thanks http docs python org library gc html gc set debug http
  • HTML5 服务器端事件:EventSource 与包装的 WebSocket

    HTML5 服务器发送事件 SSE API 是否只是 HTML5 WebSocket 之上的受限制的 基于事件的 API 在我看来 一个EventSource只是一个WebSocket that Cannot send data 使用tex
  • 将搜索结果更新为 Android 中的 Lazy Adapter

    我有项目列表 想为其实现搜索功能 因此 我有一个带有 addTextChangedListener 的文本框 搜索结果运行良好 但当我尝试将结果设置为 ListView 时 新结果将附加到旧结果中 我正在使用惰性适配器 如何清除适配器中的旧
  • Python 在 chroot 中运行时出现错误

    我尝试在 chroot 中运行一些 Python 程序 但出现以下错误 Could not find platform independent libraries
  • 在 asp.net vb 中通过第一个下拉列表值填充第二个下拉列表

    我在使用 asp net vb 时遇到了一些问题 我想做的是有2个下拉框 第一个下拉菜单将有 1 2 3 例如 第二个下拉菜单将有 A 乙 C 默认情况下 但是 如果选择 1 我希望第二个下拉菜单自动选择 c 我不知道 JavaScript
  • 如何在 golang 中创建 .der 文件,与 openssl 相同

    openssl rsa in prevate pem outform DER pubout out public der 你可能会考虑像这样的图书馆google trillian https github com google trilli
  • .NET 中的跟踪中的“开关”和“过滤器”有什么区别?

    NET 中的跟踪中的 开关 和 过滤器 有什么区别 他们似乎以相似的方式工作
  • 底图上的子图

    我有一张英国地图和 121 个地点 每个地点有 3 个值 我想绘制 121 个位置中每个位置的三个值的小条形图 目前 这些值绘制为markersize属性 看起来像这样 密集恐惧症情节 https i stack imgur com 5fv
  • Django css文件缓存

    我有一个 css 文件 我想修改它以满足我的需要 问题是它似乎被缓存在某个地方 因为无论我在 css 文件中做什么 我都看不到更改 我确信我指向了正确的文件 因为现在我已经对其进行了修改 并且它有效 有什么设置可以关闭缓存吗 谢谢 正如本文
  • 如何生成非 UTF-8 字符集

    我的要求之一是 文本框名称应仅接受 UTF 8 字符集 我想通过输入非 UTF 8 字符集来执行否定测试 我怎样才能做到这一点 如果您问如何构造非 UTF 8 字符 那应该很容易这个定义来自维基百科 http en wikipedia or
  • DynamoDB - 如果哈希(或哈希和范围组合)不存在则放置项目

    以下是我的用例 我有一个带有哈希 范围键的 Dynamo 表 当我将新项目放入表中时 我想进行唯一性检查 有时我想保证哈希值是唯一的 忽略范围 其他时候我想允许重复的哈希值 但保证哈希值和范围的组合是唯一的 我怎样才能做到这一点 我尝试了