Node JS和AWS sdk – 具有多个Expected值的putitem不起作用

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

我想防止重复的用户名和重复的电子邮件地址。 我可以成功阻止重复的用户名,但不能重复的电子邮件地址 文档声明“ComparisonOperator”:“NULL”或Exists:false行应该这样做(它们是互斥的,我不会同时尝试它们)。 但是,只有用户名validation由AWS sdk“尊敬”,即。 下面的代码可以防止重复的用户名被input到系统中,但重复的电子邮件仍然存在。

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

谢谢

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)); }); 

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

这听起来像是期待更新条件充当全局唯一键约束,类似于关系数据库可能提供的。 DynamoDB仅在主键属性上确实实施唯一性。 更新条件仅针对与该键匹配的项目属性进行评估。 您的条件更新策略适用于用户名,因为用户名是主散列键,重复的用户名将匹配同一行。 电子邮件中的条件只能保证与用户名密钥匹配的一行中的电子邮件字段为空。