How to make a UUID in DynamoDB?

后端 未结 10 1289
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-01 18:17

In my db scheme, I need a autoincrement primary key. How I can realize this feature?

PS For access to DynamoDB, I use dynode, module for Node.js.

相关标签:
10条回答
  • 2020-12-01 18:34

    Create the new file.js and put this code:

    exports.guid = function () {
        function _p8(s) {
            var p = (Math.random().toString(16)+"000000000").substr(2,8);
            return s ? "-" + p.substr(0,4) + "-" + p.substr(4,4) : p ;
        }
        return (_p8() + _p8(true) + _p8(true)+new Date().toISOString().slice(0,10)).replace(/-/g,"");
    }
    

    Then you can apply this function to the primary key id. It will generate the UUID.

    0 讨论(0)
  • 2020-12-01 18:34

    Incase you are using NoSQL DynamoDB then using Dynamoose ORM, you can easily set default unique id. Here is the simple user creation example

    // User.modal.js

    const dynamoose = require("dynamoose");
    
    const userSchema = new dynamoose.Schema(
      {
        id: {
          type: String,
          hashKey: true,
        },
        displayName: String,
        firstName: String,
        lastName: String,
      },
      { timestamps: true },
    );
    
    const User = dynamoose.model("User", userSchema);
    
    module.exports = User;
    

    // User.controller.js

    const { v4: uuidv4 } = require("uuid");    
    const User = require("./user.model");
    
    exports.create = async (req, res) => {
      const user = new User({ id: uuidv4(), ...req.body }); // set unique id
      const [err, response] = await to(user.save());
      if (err) {
        return badRes(res, err);
      }
      return goodRes(res, reponse);
    };
    
    0 讨论(0)
  • 2020-12-01 18:38

    Another approach is to use a UUID generator for primary keys, as these are highly unlikely to clash.

    IMO you are more likely to experience errors consolidating primary key counters across highly available DynamoDB tables than from clashes in generated UUIDs.

    For example, in Node:

    npm install uuid

    var uuid = require('uuid');
    
    // Generate a v1 (time-based) id
    uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'
    
    // Generate a v4 (random) id
    uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
    

    Taken from SO answer.

    0 讨论(0)
  • 2020-12-01 18:43

    Addition to @yadutaf's answer

    AWS supports Atomic Counters.

    Create a separate table (order_id) with a row holding the latest order_number:

    +----+--------------+
    | id | order_number |
    +----+--------------+
    |  0 |         5000 |
    +----+--------------+
    

    This will allow to increment order_number by 1 and get the incremented result in a callback from AWS DynamoDB:

    config={
      region: 'us-east-1',
      endpoint: "http://localhost:8000"
    };
    const docClient = new AWS.DynamoDB.DocumentClient(config); 
    
    let param = {
                TableName: 'order_id',
                Key: {
                    "id": 0
                },
                UpdateExpression: "set order_number = order_number + :val",
                ExpressionAttributeValues:{
                    ":val": 1
                },
                ReturnValues: "UPDATED_NEW"
            };
            
           
    docClient.update(params, function(err, data) {
       if (err) {
                    console.log("Unable to update the table. Error JSON:", JSON.stringify(err, null, 2));
       } else {
                    console.log(data);
                    console.log(data.Attributes.order_number); // <= here is our incremented result
        }
      });
    

    0 讨论(0)
提交回复
热议问题