为什么我的属性不存在的条件表达式在 dynamodb 中失败

Jat*_*tra 9 amazon-web-services node.js express amazon-dynamodb

我的 DynamoDB 表的主键为id. 查询记录时将使用相同的 id。

现在我想插入一条带有id和作为属性的记录,当且仅当表中不存在和originalURL时,我想插入此记录。idoriginalURL

更新:-根据文档ConditionExpression: "attribute_not_exists(id) AND attribute_not_exists(originalURL)",仅在主键上下文中有效(您可以执行条件放置操作(如果指定主键不存在,则添加一个新项目),所以是否存在?没有什么区别。所以我需要一个两个条件都有效的解决方案,或者originalURL也充当关键attribute_not_exists(originalURL)

router.post('/', async function (req, res, next) {

  urlId = await nanoid(8);


  //const hashids = new Hashids('this is my salt')
  //urlId=hashids.encode(1)
  console.log('jatin', urlId);
  // urlId=uuidv4();

  const { longURL } = req.body

  const params = {
    TableName: 'url',
    Item: {
      "id": urlId,
      "originalURL": longURL
    },
    UpdateExpression: "set originalURL = :y",
    ConditionExpression: "attribute_not_exists(id) AND attribute_not_exists(originalURL)"
  }
  dynamoDb.put(params, (error, data) => {
    if (error) {
      console.log(error);
      res.status(400).json({ error: error });
    } else if (Object.keys(data).length === 0 && data.constructor === Object) {
      res.status(200).json(
        {
          urlId,
          longURL,
          status: 'success'
        })
    }

    else {
      res.status(400).json({ error: 'Please try again' });
    }
  })
});
Run Code Online (Sandbox Code Playgroud)

截至目前,即使我尝试使用已存在的 sam 原始 URL 发送请求,它也会成功添加我不想要的记录。

Ari*_*rty 1

对于putItemapi,您可以使用条件表达式。根据医生的说法

条件表达式

为了使条件 PutItem 操作成功,必须满足的条件。

表达式可以包含以下任意内容:

功能:attribute_exists | 属性不存在 | 属性类型 | 包含| 开始于 | 尺寸

这些函数名称区分大小写。

比较运算符:= | <> | < | > | <= | >= | 之间 | 在

逻辑运算符:AND | 或 | 不是

有关条件表达式的更多信息,请参阅 Amazon DynamoDB 开发人员指南中的条件表达式。

类型:字符串

必需: 否

本文档也解释了相同的场景:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html#Expressions.ConditionExpressions.PreventingOverwrites

PutItem 操作会覆盖具有相同键的项目(如果存在)。如果您想避免这种情况,请使用条件表达式。仅当相关项目尚未具有相同的密钥时,这才允许继续写入。

aws dynamodb put-item \
    --table-name ProductCatalog \
    --item file://item.json \
    --condition-expression "attribute_not_exists(Id)" 
Run Code Online (Sandbox Code Playgroud)

  • 你的参考资料是正确的,但没有任何用处!因为我的问题与 AND 运算符连接的 2 个条件有关,主键属性条件似乎也应该有效,所以我需要一个两个条件都有效的解决方案,或者 OriginalURL 也充当键 (2认同)