【问题标题】:stopping duplicate entry in dynamodb停止 dynamodb 中的重复条目
【发布时间】:2017-11-23 14:53:33
【问题描述】:

我在 Dynamodb 中有一个名为 followProduct 的表,它具有以下结构

id - item id
email - user email
product - product id

每当用户关注产品时,我都会在表格中输入一个条目。我正在尝试停止重复输入并使用以下代码

let params = {
    TableName: "followProduct",
    ConditionExpression: "email <> :email AND product <> :pid",
    Item: {
        email: "a@a.com",
        product: req.body.productId,
        id: shortid.generate()
    },
    ExpressionAttributeValues: {
        ':email': "a@a.com",
        ":pid": req.body.productId
    }
};
createItemInDDB(params).then(() => {
    res.status(200).send("Company Added");
}, err => {
    console.log(err);
    res.sendStatus(500);
});

CreateItemInDDB 只是一个以参数为输入并运行文档客户端提供的 put 函数的函数。此参数仍在重复输入。我希望对于每封电子邮件,每个产品 ID 只能输入一次。

【问题讨论】:

    标签: node.js amazon-web-services amazon-dynamodb


    【解决方案1】:

    您能描述一下您的表哈希范围键吗?

    Dynamodb 只能对哈希范围表键强制唯一性(不适用于全局二级索引键)

    来自http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html

    要防止新项目替换现有项目,请使用包含attribute_not_exists 函数的条件表达式,并将属性名称用作表的分区键。由于每条记录都必须包含该属性,attribute_not_exists 函数只有在不存在匹配项时才会成功。

    http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html:

    PutItem 操作将覆盖具有相同键的项目(如果存在)。如果您想避免这种情况,请使用条件表达式。这将允许写入仅在有问题的项目还没有相同的密钥时继续进行:

    【讨论】:

    • Id 是这里的主键。假设我有一个条目 1,a@a.com,pid1.... 我不想要像 2, a@a.com,pid1 这样的条目。可以使用 ConditionExpression 处理吗? ?
    • 所以哈希键是 id 而电子邮件是范围键?在这种情况下,dynamodb 只能对 id-email 强制唯一性。所以在你的情况下(如果我理解得很好),你唯一的选择是添加二级索引 email-pid,并在插入之前对其进行查询(如果是多线程则使用锁)。在这种情况下,如果每个用户(电子邮件)有很多记录,那么您需要高容量(否则会出现吞吐量错误)
    • 知道了。如果我将架构更改为电子邮件 - 哈希键和产品排序键怎么办。然后我只是它将对这对强制执行唯一性,并且我不会有重复的条目。 ?
    • 正如我上面写的那样,你应该在这种情况下使用attribute_not_exists
    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2016-12-05
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2016-12-20
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多