节点JS和AWS sdk - 具有多个预期值的putitem不起作用

时间:2014-06-02 18:58:28

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

我正在使用以下代码从node.js / express框架中查询dynamodb实例。代码正在查询名为User的表,该表具有用户名的哈希键主键,没有范围。它没有本地二级索引和3个全局二级索引(last_name-first_name,email_last-name和company_ [no range])。

我想防止重复的用户名和重复的电子邮件地址。我可以成功防止重复的用户名,但不能重复电子邮件地址。文档陈述了 “ComparisonOperator”:“NULL”或存在:假行应该这样做(它们是互斥的,我不会同时尝试它们)。但是,只有用户验证才能被AWS sdk“尊重”,即。下面的代码可以防止重复的用户名输入系统,但仍会发生重复的电子邮件。

如果我将两个“预期:”密钥(用户名和电子邮件)都留下,putitem只需添加一条新记录或使用相同的用户名更新现有记录(如文档状态和我期望的那样),但两者都留在或只是电子邮件密钥不会阻止数据库中的重复电子邮件。请帮忙。

感谢

var d = new Date();
var dt = d.getTime();

params = {
    TableName: 'User',
    Expected: {
        "username": {
            Exists: false
            // tried this also ->  "ComparisonOperator": "NULL"
        },
        "email": {
            Exists: false
           // tried this also ->  "ComparisonOperator": "NULL"
        }

    },  
    Item: { 
        username: {S: req.body.username},
        created: {N: "" + dt + ""},
        company: {S: req.body.company},
        fname: {S: req.body.fname},
        lname: {S: req.body.lname},
        companies: {SS: [req.body.company]},
        email: {S: req.body.email},
        is_admin: {S: req.body.is_admin},
        is_vendor: {S: req.body.is_vendor},
        password: {S: req.body.pass}
    }
};

dynamodb.putItem(params, function(err, data) {
    var obj = new Object();
    obj.data = {};
    obj.data.username = req.body.username;
    obj.data.fname = req.body.fname;
    obj.data.lname = req.body.lname;
    obj.data.company = req.body.company;
    obj.data.email = req.body.email;
    obj.data.is_admin = req.body.is_admin;
    obj.data.is_vendor = req.body.is_vendor;
    if (err) {
        obj.status = "false";
        obj.error = err;
    }
    else{
        obj.status = "true";
    }
    res.send(JSON.stringify(obj));  
});

1 个答案:

答案 0 :(得分:2)

我建议首先对电子邮件索引进行查询,以便在创建新用户之前检查电子邮件地址是否存在。

听起来您期望更新条件充当全局唯一键约束,类似于关系数据库可能提供的约束。 DynamoDB仅真正强制主键属性的唯一性。仅根据密钥匹配的项属性评估更新条件。您的条件更新策略适用于用户名,因为username是主哈希键,重复的用户名将匹配同一行。电子邮件上的条件仅保证电子邮件字段在与用户名密钥匹配的一行上为空。