停止dynamodb中的重复条目

Ris*_*ain 1 amazon-web-services node.js amazon-dynamodb

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

id - item id
email - user email
product - product id
Run Code Online (Sandbox Code Playgroud)

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

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);
});
Run Code Online (Sandbox Code Playgroud)

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

Eya*_* Ch 5

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

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 而电子邮件是范围键?在这种情况下,dynamodb 只能为 id-email 强制唯一性。所以在你的情况下(如果我理解得很好),你唯一的选择是添加二级索引电子邮件pid,并在插入之前对其进行查询(如果多线程使用锁)。在这种情况下的缺点是,如果每个用户(电子邮件)都有很多记录,则需要高容量(否则会出现吞吐量错误) (2认同)