首页 > 解决方案 > DynamoDB 有没有办法生成唯一的 autoID?

问题描述

我是 DynamoDB Lamda 的新手,我正在学习一些教程,但我需要有什么方法可以在 Dynamodb 中生成 autoid 吗?

这是我的 lambda 函数,因为您看到我将 QuestionID 作为硬编码传递我需要知道有没有办法为此创建唯一的?我想我可以将数学随机函数与时间戳联系起来,但我真的很想知道创建它的更好选择。

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({region: 'us-east-2', apiVersion: '2012-08-10'});

exports.handler = (event, context, callback) => {
    const params = {
        Item: {
            "QuestionID": {
                S: "dasf787af8safa"
            },
            "Would": {
                S: "2ass8"
            },
            "Rather": {
                S: "asda"
            },
            "wouldClick": {
                N: "2"
            },
            "ratherClick": {
                N: "2"
            }
        },
        TableName: "Would-You-Rather"
    };
    dynamodb.putItem(params, function(err, data) {
        if (err) {
            console.log(err);
            callback(err);
        } else {
            console.log(data);
            callback(null, data);
        }
    });
};

标签: node.jsamazon-web-servicesaws-lambdaamazon-dynamodb

解决方案


它不是开箱即用的。如果你想要一个数字 PK,你可以利用这样的东西:

client.update_item(
      TableName='JiraTable', Key={
         'PK': { 'S': 'PROJECT#my-project'
         'SK': { 'S': 'PROJECT#my-project' }
    }, }
  UpdateExpression="SET #count = #count + :incr",
  ExpressionAttributeNames={ "#count": "IssueCount", }, 
  ExpressionAttributeValues={
    ":incr": { "N": "1" } 
  },
  ReturnValues='UPDATED_NEW'
)

current_count = resp['Attributes']['IssueCount']['N']

resp = client.put_item(
  TableName='JiraTable',
  Item={
    'PK': { 'S': 'PROJECT#my-project' },
    'SK': { 'S': f"ISSUE#{current_count}"},
    'IssueTitle': {'S':'Build DynamoDB data model'}
  }
)

如果您想使用 UUID,并且您对此非常确定,我建议您使用 KSUID。KSUID 是在开头包含时间戳的唯一标识符。这允许按时间顺序排序以及唯一性。

尽管如此,您真的想使用这种类型的数据作为您的分区键吗?您应该利用一些信息更丰富的数据,例如电子邮件,否则您会丢失对您的访问模式有用的索引。


推荐阅读