首页 > 解决方案 > DynamoDB createIfNotExist

问题描述

在 dynamoDB 中,我应该创建某种日志信息,这些信息具有用户可以更改的状态。但这是不必要的额外信息。主要问题是:

  1. 我有一个对象:
{
  id: '123',
  log: 'mybestlog',
  state: 'PENDING'
}
  1. id如果相同的文档不存在,我想创建这个文档对象。
  2. id如果具有相同退出的对象,我想取回当前对象和标志。

希望我说得足够清楚。

我试着做:

      const result: PutItemOutput = await this.dynamodbClient.put({
          TableName: this.config.tableName,
          Item: {
            ...newItem,
            status: statusEnum.PENDING,
            creationDate: moment().toISOString(),
          },
          ConditionExpression: 'attribute_not_exists(id)',
          ReturnValues: 'ALL_NEW',
      })
        .promise()
        .catch((error) => {
          this.logger.error(`### END-ERROR ${methodDescription} | error: ${error}`, metadata);
          throw new InternalServerErrorException(error.stack);
        });

但找不到任何响应Items或标志Exist。我得到了AWS.DynamoDB.PutItemOutput

      {
        Attributes?,
        ConsumedCapacity?,
        ItemCollectionMetrics?,
      }

请帮助我,在我的情况下最好的解决方案是什么。

标签: node.jsamazon-web-servicesamazon-dynamodb

解决方案


您不会按照您的想法收到带有项目在 dynamoDB 中退出的标志的响应。

当您使用该ConditionExpression调用 put 操作时。两个主要结果以及对您重要的结果是:

  1. 您的ConditionExpression成功,您将在Attributes Key中获得ALL_NEW值。
  2. 否则你会得到一些错误。对您来说重要的是ConditionalCheckFailedException,这意味着ConditionExpression失败并且密钥已经存在。

您需要相应地自行调整响应。


推荐阅读