Node.js 节点JS和AWS sdk-具有多个预期值的putitem不工作

Node.js 节点JS和AWS sdk-具有多个预期值的putitem不工作,node.js,amazon-web-services,amazon-dynamodb,Node.js,Amazon Web Services,Amazon Dynamodb,我使用以下代码从node.js/express框架中查询dynamodb实例。代码正在查询一个名为User的表,该表的散列键主键为username,没有范围。它没有本地二级索引和3个全局二级索引(姓氏、电子邮件姓氏和公司姓氏[范围]) 我想防止重复的用户名和重复的电子邮件地址。我可以成功防止重复的用户名,但不能防止重复的电子邮件地址。文件说明了 “ComparisonOperator”:“NULL”或存在:应使用假行(它们是互斥的,我不会同时尝试它们)。但是,只有用户名验证被AWS sdk“认可

我使用以下代码从node.js/express框架中查询dynamodb实例。代码正在查询一个名为User的表,该表的散列键主键为username,没有范围。它没有本地二级索引和3个全局二级索引(姓氏、电子邮件姓氏和公司姓氏[范围])

我想防止重复的用户名和重复的电子邮件地址。我可以成功防止重复的用户名,但不能防止重复的电子邮件地址。文件说明了 “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));  
});

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


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

运行此代码的一个示例是Thank James,文档阅读起来没有您的解释那么清楚。您预先检查系统中指定电子邮件的解决方案是有意义的,但我想首先确保我没有遗漏什么。谢谢你,先生!更新James的建议手动检查电子邮件是最好的解决方案,但请确保您执行查询(而不是“最终一致”的扫描),并且查询不能使用“最终一致”的全局二级索引。此外,您必须使用LSI执行查询,PK或只是一个带有查询过滤器的查询&确保使用“强一致性”查询,否则可能会得到不好的结果(第二个唯一字段[本例中的电子邮件]可能在数据库中不存在,但确实存在,因为在最终一致的类型查询中返回了过时的数据).UPDATE-您不能根据AWS文档对非索引字段执行强一致性查询。您不能对全局二级索引执行强一致性读取,您必须知道哈希才能对本地二级索引执行查询。所以,我想在dynamodb中不能有两个相互独立的唯一字段。我有一个类似的问题,并将其发布到dynamodb开发论坛上。您可能会发现它很有用: