【问题标题】:DynamoDb with ConditionExpression带有 ConditionExpression 的 DynamoDb
【发布时间】:2015-03-02 10:38:17
【问题描述】:

考虑以下 DynamoDb 表:

表名:foo-bar 哈希键:Foo, str 范围键:Bar, str 姓名:Baz, str

现在使用vogels API,我正在尝试插入一个带有 HashKey、新 RangeKey 和 Name 的项目。

但是给定的 HashKey 的名称不能存在:

所以我们为 vogels API 定义表格布局:

var foobar = vogels.define("foo-bar", {
    tableName: "foo-bar",
    hashKey: "foo",
    rangeKey: "bar",
    schema: {
        "foo": Joi.string(),
        "bar": Joi.string(),
        "name": Joi.string()
    }
});

然后是item的插入:

var itemToInsert = { foo: "foo", bar: "bar2", name: "TEST" };

var params = {};
params.ConditionExpression = "foo <> :foo AND name <> :name";
params.ExpressionAttributeValues = {
    ":foo": itemToInsert.foo,
    ":name": itemToInsert.name
};

foobar
    .create(itemToInsert, params, function(error, data) {
        if(error) {
            console.log(error);
        }
        else {
            console.log(data);
        }
});

表中已有一项具有以下值:{foo: "foo", bar: "bar", name: "TEST" }

所以我期待系统给我一个错误,因为由于ConditionExpression 已经存在匹配项,但是该项目被插入没有问题。 DynamoDb 不可能吗?

请注意,无论我使用vogels还是直接使用aws-sdk都没有关系,它们都有相同的问题,即插入项目并且ConditionExpression不会阻止插入。

【问题讨论】:

  • 我不熟悉vogels,但是如果您将expression attribute name placeholder 用于属性name,会发生什么? IE。 "foo &lt;&gt; :foo AND #n &lt;&gt; :name";,然后是 params.ExpressionAttributeNames = {"#n": "name"}。我想知道错误是否被吞没了,还是因为name is a reserved word.
  • 嘿@Mike,感谢您的提醒,但出于保密原因,我不得不擦掉这些名字。这些不是实际名称。

标签: amazon-web-services amazon-dynamodb


【解决方案1】:

DynamoDB 插入您的项目的原因是因为您的表使用 hashkey: foo, rangekey: bar 的复合键。您正在尝试插入具有不同键的项目,在本例中为 hashkey: foo, rangekey: bar2。在 DynamoDB 中,插入项目时,条件表达式仅针对与完全相同的哈希和范围键匹配的现有项目进行测试。

您正在尝试在非键属性上添加唯一约束,这目前不可能用于 DynamoDB,并且需要更改架构才能强制执行此约束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2022-01-21
    • 2020-09-14
    相关资源
    最近更新 更多