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

GSI上带条件检查的DynamoDBSaveExpression

梁嘉祥
2023-03-14

我想进行更新,但我想添加的条件检查不是基于主表的哈希/范围,而是基于GSI。

实际上,如果给定属性(即GSI的哈希)已经存在,我希望保存失败。

例如,在一个虚构的employees表中,“SSN”是散列键,“EmployeeId”上有一个GSI。这两个属性都必须是独一无二的。在保存员工时,我希望确保表中没有使用“SSN”或“EmployeeId”。我可以用表的散列,也就是SSN,但不能用GSI的散列。

支持吗?我在文件中没有看到这一点。

谢谢!

共有1个答案

谢翰学
2023-03-14

您描述的方法不可能使用DynamoDB,即使是在新宣布的事务中。原因是您的GSI最终是一致的,可能无法反映表中项目的最新状态,因此不能在GSI上使用ConditionExpression。

但是,您可以通过使用单独的EmployeeId InUse表来实现类似的功能。它可以简单到一个属性:employeeId。因为这是一个表而不是GSI,所以可以使用TransactionWriteItems请求同时向EmployeeData和EmployeeId写入use表。如果事务的任何部分失败,事务将失败,因此可以使用ConditionExpression防止覆盖现有项,以确保在SSN或EmployeeId已经存在的情况下事务将失败。

下面是dynamodb请求的“TransactiveItems”部分的示例。

“TransactItems”: [
    {
        “Put” : {
            “ConditionExpression” : “attribute_not_exists(ssn)”,
            “Item” : {
                ... employee data goes here ...
             },
            “TableName”: “EmployeeData”
        }
    },
    {
        “Put” : {
            “ConditionExpression” : “attribute_not_exists(employeeId)”,
            “Item” : {
                “employeeId”: {
                      “S” : “Employee1457”
                }
            },
            “TableName”: “EmployeeIDs-InUse”
        }
    }
]

这里有几件事你需要注意。确保在每次添加或删除员工时,以及在更新与给定SSN关联的EmployeeId时,都更新了使用中的EmployeeId。此外,请注意,一个事务将消耗两倍于常规写入的容量。

 类似资料:
  • 在我的Dynamodb表中,该表包含分区键“id”和“created_at”作为排序键的“batchs”和一个带有“batch_status”的GSI 假设我想查询状态为“正在进行”、“新建”、“已完成”的批。

  • 我有一个名为“弗兰克”的DynamoDB表,只有一个GSI。分区键称为PK,排序键称为SK,GSI分区键称为GSI1_PKGSI排序键称为GSI1_SK。我有一个存储实际数据的“数据”映射。 GSI分区键和排序键直接映射到表中具有相同名称的属性。 我可以运行partiql查询来获取图像中显示的结果。以下是PartIQ代码: 注意分区代码是如何多次引用“GSI1_SK”的。分区查询有效,并返回图像中

  • 我确信我在这里遗漏了一些显而易见的东西,但我不知道如何针对客户检查现有卡。 我在laravel应用程序中使用stripe connect api代表他人管理付款,基本流程如下: < Li > stripe < code >令牌通过< code>stripe.js创建,并与支付表单一起提交 < li >如果客户存在于本地数据库中,我获取他们的< code>stripe_id,否则使用令牌作为源/卡创

  • 我有带GSI的dynamodb表,如下所示: 现在,我想添加一个新的时间表,在添加此项之前,我想确保GSI不已经包含此组合"2388#Tom"。 我如何才能实现这一点,我想在GSI上使用一个条件表达式,而做putItem操作,但我不确定是否发电机db支持次要索引上的条件表达式? 任何帮助都将不胜感激。

  • 如何简化空检查 我已经实现了以下空条件检查 我正在用空检查条件验证Employee类的所有属性,这可以用C#简化吗。

  • 问题内容: 在执行一个简单的编译器检查之前,在一个Swift项目中,查看运行的是哪种方案,然后有条件地包含或不包含代码。例如: 但是由于某种原因,在我的Objective-C项目中,这似乎不起作用。应该以相同的方式工作吗?还是Swift编译器具有一些允许这种行为的进步? 问题答案: 用 您可以在此处定义预处理器宏 希望这可以帮助