不使用扫描验证 DynamoDB 中的属性?

2023-11-30

如何在不使用 dynamodb 中的 scan 的情况下验证属性是否存在于表中?

在我的用例中,从客户端,客户请求其 Customer_id 以了解产品的价值。在服务器端,必须检查输入的 customer_id 是否已存在于 DynamoDB 表中。如果没有,则必须进行新条目。

如何在不使用表的 SCAN 操作的情况下实现这种情况?


在我看来,你想做一个有条件的PutItem在此表上:如果没有其他相同的项目,则将该项目放入表中customer_id。这很容易做到,因为customer_id是表的哈希键。来自PutItem 文档:

Note

要防止新项目替换现有项目,请使用条件 put 操作比较运算符 set to NULL为了 主键属性,或属性。

以下是我使用 Java SDK 中的 Dynamo DB 文档 API 编写并针对 DynamoDB Local 运行的快速示例:

import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Expected;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType;
import com.amazonaws.services.dynamodbv2.util.Tables;

public class StackOverflow {

    private static final String EXAMPLE_TABLE_NAME = "example_table";

    public static void main(String[] args) {
        AmazonDynamoDB client = new AmazonDynamoDBClient(new BasicAWSCredentials("accessKey", "secretKey"));
        client.setEndpoint("http://localhost:4000");
        DynamoDB dynamoDB = new DynamoDB(client);
        if (Tables.doesTableExist(client, "example_table")) client.deleteTable(EXAMPLE_TABLE_NAME);

        // Create table with hash key 'customer_id'
        CreateTableRequest createTableRequest = new CreateTableRequest();
        createTableRequest.withTableName(EXAMPLE_TABLE_NAME);
        createTableRequest.withKeySchema(new KeySchemaElement("customer_id", KeyType.HASH));
        createTableRequest.withAttributeDefinitions(new AttributeDefinition("customer_id", ScalarAttributeType.S));
        createTableRequest.withProvisionedThroughput(new ProvisionedThroughput(15l, 15l));
        dynamoDB.createTable(createTableRequest);
        Tables.waitForTableToBecomeActive(client, EXAMPLE_TABLE_NAME);

        Table exampleTable = dynamoDB.getTable(EXAMPLE_TABLE_NAME);

        exampleTable.putItem(new Item()
                .withPrimaryKey("customer_id", "ABCD")
                .withString("customer_name", "Jim")
                .withString("customer_email", "[email protected]"));

        System.out.println("After Jim:");
        exampleTable.scan()
                    .forEach(System.out::println);
        System.out.println();

        try {
            exampleTable.putItem(new Item()
                    .withPrimaryKey("customer_id", "EFGH")
                    .withString("customer_name", "Garret")
                    .withString("customer_email", "[email protected]"), new Expected("customer_id").notExist());
        } catch (ConditionalCheckFailedException e) {
            System.out.println("Conditional check failed!");
        }

        System.out.println("After Garret:");
        exampleTable.scan()
                    .forEach(System.out::println);
        System.out.println();

        try {
            exampleTable.putItem(new Item()
                    .withPrimaryKey("customer_id", "ABCD")
                    .withString("customer_name", "Bob")
                    .withString("customer_email", "[email protected]"), new Expected("customer_id").notExist());
        } catch (ConditionalCheckFailedException e) {
            System.out.println("Conditional check failed!");
        }

        System.out.println("After Bob:");
        exampleTable.scan()
                    .forEach(System.out::println);
    }
}

Output:

After Jim:
{ Item: {[email protected], customer_name=Jim, customer_id=ABCD} }

After Garret:
{ Item: {[email protected], customer_name=Garret, customer_id=EFGH} }
{ Item: {[email protected], customer_name=Jim, customer_id=ABCD} }

Conditional check failed!
After Bob:
{ Item: {[email protected], customer_name=Garret, customer_id=EFGH} }
{ Item: {custo[email protected], customer_name=Jim, customer_id=ABCD} }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不使用扫描验证 DynamoDB 中的属性? 的相关文章

  • 异步方法中的 Await 与 Task.Result [重复]

    这个问题在这里已经有答案了 执行以下操作有什么区别 async Task
  • AWS S3 中有乐观锁吗?

    我在 s3 中有一个 excel 文件 由于不同的程序读取和写入它 我需要保证每个程序都写入它们读取的版本 S3仅保证新创建对象的读后一致性 以及覆盖和删除对象的最终一致性 如果您的 Excel 文件足够小 小于 400kb 您可以将其存储
  • DynamoDB 触发器 Lambda 函数问题:函数调用失败

    我在 dynamoDB 表上启用了流 当项目被修改时 会触发 lambda 函数 我认为我在 lambda 触发器端 权限和 dynamodb 端都正确设置了所有内容 我还使用测试数据运行了 lambda 函数 并且成功了 但是 当修改表中
  • Heroku Dynos 是否享受 AWS 网络内的免费数据传输?

    我正在考虑将 Heroku 用于 NodeJS 应用程序 我想知道他们的 Dynos 是否享受 AWS 网络内的免费内部数据传输 我想使用 DynamoDB ElastiCache RDS SQS 和许多其他 AWS 产品 如果我可以从 H
  • 通过 AWS API Gateway 集成模板使用 DynamoDB 的 lastEvaluatedKey 进行扫描

    我使用 AWS APIGateway 集成模板直接扫描 dynamoDB 而不是编写单独的 lambda 来处理请求 响应 但是 扫描有 1MB 的限制 这导致扫描仅限于部分数据 根据文档 我们应该重新扫描 直到找到匹配项或使用 lastE
  • DynamoDB:键及其含义

    我对如何使用 DynamoDB 表键感到困惑 该文档提到了 HASH 似乎也称为分区 键和 RANGE 或排序 键 我试图将这些与我之前对数据库索引理论的理解大致保持一致 我目前主要基于猜测的理解是 HASH 键本质上是主键 它必须是唯一的
  • AWS IAM——使用条件

    我是 AWS 中的 IAM 新手 而且 我希望将各种用户的查询限制为仅主键与 cognito id 匹配的表条目 为了实现这一目标 我制定了政策 Version 2012 10 17 Statement Sid AllowAccessToO
  • Django 中是否有适用于 Amazon DynamoDB 的良好数据库后端? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在我的下一个 Django 项目中使用 DynamoDB 我已经找到了将会话数据存储到 Dynam
  • 可以在没有 dynamoDB 的情况下使用 AWS App-Sync

    我对 Amazon app sync 的离线和同步功能感兴趣 但我想知道它是否可以在没有 dynamoDB 作为后端的情况下使用 用 VTL 为 dynamoDB 编写的 graphQL 解析器看起来很糟糕 看来使用 mongo 后端会好得
  • 适用于 Web 照片库的正确 NoSQL 数据架构

    我正在寻找为照片库的 NoSQL 存储构建合适的数据结构 在我的网络应用程序中 一张照片可以是一个或多个相册的一部分 我有使用 MySQL 的经验 但几乎没有使用键值存储的经验 使用 MySQL 我将设置 3 个表 如下所示 photos
  • AmazonDB 免费套餐的含义是什么?

    在我的 Android 应用程序中 我使用 Amazon DynamoDB 我创建了 10 个表 读取容量为 10 写入容量为 5 今天我收到了一封来自 Amazon 的电子邮件 我花了 11 36 美元 我不明白免费套餐的含义 这是我从亚
  • DynamoDBMappingException:HASH 键没有映射

    编写 DynamoDB Java 应用程序时 如果表及其数据模型配置不正确 则在写入表或从表中检索时 您可能会收到 无 HASH 键映射 错误 完整的异常类似于 com amazonaws services dynamodbv2 datam
  • 全文搜索 DynamoDB

    以下情况 我正在为我的客户将元素存储在 DyanmoDb 中 HashKey 是元素 ID Range Key 是客户 ID 除了这些字段之外 我还存储一个字符串数组 gt 标签 例如 Pets House 和多行文本 我想在我的应用程序中
  • AWS Lambda 调用错误未触发 SQS 死信队列

    我有一个 AWS Lambda 函数 它订阅 DynamoDB 流并配置了SQS 死信队列 DLQ https docs aws amazon com lambda latest dg dlq html 我可以看到管理控制台中配置了正确的队
  • DynamoDB 中的时间戳应使用什么数据类型?

    我是 DynamoDB 新手 我希望创建一个使用 DeviceID 作为哈希键 时间戳作为范围键和一些数据的表 DeviceID 123 Timestamp 2016 11 11T17 21 07 5272333Z X 12 Y 35 在
  • DynamoDB 如何查询重叠的时间范围

    考虑一个由主键和两个描述开始日期和结束日期的属性组成的 DynamoDB 表 如何在不扫描全表的情况下查询某个时间范围是否与表中的时间范围重叠 例子 dynamo表有两条记录 PK Start End A 2019 01 01 2019 1
  • DynamoDB 冲突解决策略

    DynamoDB 的冲突解决策略是什么 Dynamo 的白皮书谈到了通过 GetItem 返回多个版本以供客户端解析 This SO 问题 https stackoverflow com questions 41933959 how do
  • 嵌套字段索引

    我正在尝试使用 AWS 开发人员控制台中的仪表板在嵌套字段上创建索引 例如 如果我有以下架构 id 1 nested mode mode1 text nice text 我能够创建索引nested mode 但是每当我通过索引进行查询时 就
  • 如何在 DynamoDB 中有条件地执行 SET 操作

    我在 DynamoDb 中有一个包含以下列的聚合表 id sum count max min and hash 我会一直想更新sum and count但会想更新min and max仅当我的值大于 小于数据库中已有的值时 另外 我只希望此
  • 重命名表?

    我有一个名为的 DynamoDB 表Transactions我正在其中记录我的应用程序中活动的审计跟踪 午夜过后 我想将表重命名为类似的名称Transactions 2015 10 01并创建一个名为的新表Transactions 我将在我

随机推荐

  • CSS 显示不起作用

    我真的很沮丧因为Display none没有在处理 tr IE 7 中的元素 我该怎么办 它在 FF Chrome 等上完美运行 首先使用以下工具检查您的代码是否正确 HTML 验证器 CSS 验证器 tr
  • 使用 json lib 使用 Python 从嵌套 JSON 中获取元素

    我想列出 BoxDet 中名称为 BoxDet 的所有元素 目的是以这种方式列出它 BoxDet ABC 我的 JSON 的一小部分 id 1 name BoxH readOnly true children id 100 name Box
  • 从 Hoxton.SR4 升级到 Spring Cloud Hoxton.SR7 后遇到错误

    使用 Spring CloudHoxton SR4和 Spring Boot2 2 9 RELEASE库 我的 Spring Boot 微服务可以正确启动 并且在本地环境中针对 localstack 运行时运行得很好 但是当我升级到Hoxt
  • 如何通过 LINQ to XML 创建字典

    我有以下 XML
  • PhoneGap 未发出 AJAX (jsonp) 请求

    我一整天都在努力解决这个问题 并用谷歌搜索了所有地方 可能我只是找不到包含解决方案的一页 但我已经查看了问题和解决方案 例如 Ajax 调用phonegap 不发送请求 JQuery mobile Phonegap Ajax 调用无法在 A
  • 将具有相同 ID 类和标签 HTML 的多个元素拖放到屏幕上的任意位置

    大家好 这是我的第一个问题 所以我可能做错了 我想要实现的是拥有多个
  • 实现 PostgreSQL 表的历史记录

    我想实现 PostgreSQL 表的更改历史记录 该表的定义方式如下 CREATE TABLE ps counters psid integer NOT NULL counter bigint NOT NULL 我希望历史表看起来像 CRE
  • 读取刚刚写入临时文件的数据[重复]

    这个问题在这里已经有答案了 在 Go 中 我尝试将数据写入临时文件 然后转身读取该文件 但没有成功 下面是一个精简的测试程序 我已通过检查临时文件验证数据是否已写入文件 所以 至少我知道数据正在进入文件 我只是无法读出它 提前谢谢你的帮助
  • TMDb API 调用 - Swift

    我正在打电话TMDb Api按类型获取一系列电影 我想访问的许多属性都返回 nil 例如 vote count poster path 和 vote average 如果我在浏览器中调用 api 我会按预期获得所有属性 这是我的模型 imp
  • 如何使用 android 中的 zxing 库从相机预览中解码条形码?

    我想在我的 android 应用程序中实现独立的扫描仪 我在我的项目中使用 zxing 的 core jar 库 我需要从相机预览中解码条形码 但我不知道如何实现它 因为没有官方文档 您能为我提供一个有关以下事项的简单示例吗 1 初始化相机
  • Paypal 错误:文件系统检查失败

    我知道 SO 上有两篇关于此错误的帖子 就像我发现的每个谷歌结果一样 解决方案是 不要使用越狱设备 但我的很干净 我的客户也是如此 我用 Paypal 开发了两个应用程序 第一个效果非常好 第二个在 Paypal 按钮初始化时在调试器中显示
  • 如何使用多个 OR 语句根据对象的属性过滤数组

    这个问题很难用语言表达 但这是我的情况 我在一个名为的数组中有几个 Monster 对象monsters 每个怪物都有一个name属性是一个字符串 我有第二个数组称为monsterNames 其中包含几个怪物名称 作为字符串 我希望能够过滤
  • 如何避免 Angular 2 在链接中添加前缀“unsafe”? [复制]

    这个问题在这里已经有答案了 使用Angular 2 是否有一个设置可以避免添加前缀 unsafe 到链接 我需要为 Angular 2 中默认未列入白名单的协议设置链接 但我们的内部应用程序需要它 因此结果是无效链接 a href a pl
  • 带有文本和图像的 Android 按钮

    在看到有关此功能的许多问题并尝试遵循答案后 我想知道是否有更清晰的示例 编辑 我试图制作一个大按钮 其中的图像和文本位于 中间 它必须表现为一个按钮 StateList 可绘制 并且图像 文本对应该分组并居中 作为一个组 如果您喜欢带有图像
  • 如何在 ASP.Net MVC2 中完成这种类型的 URL?

    我有一个名为 类别 的表 我希望用户从类别列表中单击 然后加载该类别中所有拍卖的列表 很简单 对吧 我可以为每个类别创建一个操作 例如 public ActionResult Cellphones public ActionResult E
  • 为什么这些记录没有存储在缓存中?

    我想在收到记录后对其进行缓存 但我不知道如何进行 根据文档 您只需调用this store push model record 但似乎不起作用 Ember 在每次调用路由时都会从服务器请求数据 我只想执行一次 并在从服务器获取数据后使用本地
  • Google Sheet:如何使用 arrayformula 将数据从一张纸复制到另一张纸?

    在Google电子表格中 我想将sheet1中的A2 G500同步到sheet2 我知道以下两种方法 use IMPORTRANGE 在sheet2的A1中输入以下公式 导入范围 电子表格网址 表1 A2 G500 它有效 但感觉我做得太过
  • 添加不存在的订单元数据以扩展 WooCommerce 管理订单搜索

    继我之前的问题之后 我还有一个问题 允许在 WooCommerce 管理订单列表中使用帐单电子邮件进行搜索 以下是我的代码 用于将电子邮件和电子邮件显示为 md5 电话号码和支付网关名称 add filter manage edit sho
  • 将循环的结果分配给Python中的变量[重复]

    这个问题在这里已经有答案了 考虑一个我想使用解析的列表for friends Joe Zoe Brad Angelina Zuki Thandi Paris for i in friends print i 将返回 Joe Zoe Brad
  • 不使用扫描验证 DynamoDB 中的属性?

    如何在不使用 dynamodb 中的 scan 的情况下验证属性是否存在于表中 在我的用例中 从客户端 客户请求其 Customer id 以了解产品的价值 在服务器端 必须检查输入的 customer id 是否已存在于 DynamoDB