Ich bin neu in Dynamodb. Ich möchte den ID-Wert automatisch putitem
erhöhen, wenn ich ihn mit dynamodb verwende.
Ist das möglich?
Ich bin neu in Dynamodb. Ich möchte den ID-Wert automatisch putitem
erhöhen, wenn ich ihn mit dynamodb verwende.
Ist das möglich?
Antworten:
DynamoDB bietet dies nicht sofort an. Sie können in Ihrer Anwendung etwas generieren, z. B. UUIDs, die für die meisten Systeme eindeutig genug sein sollten.
Ich habe festgestellt, dass Sie Node.js verwenden (ich habe Ihr Tag entfernt). Hier ist eine Bibliothek, die UUID-Funktionalität bietet: Node- UUID
Beispiel aus README
var uuid = require('node-uuid');
var uuid1 = uuid.v1();
var uuid2 = uuid.v1({node:[0x01,0x23,0x45,0x67,0x89,0xab]});
var uuid3 = uuid.v1({node:[0, 0, 0, 0, 0, 0]})
var uuid4 = uuid.v4();
var uuid5 = uuid.v4();
Dies ist ein Anti-Pattern in DynamoDB, das so aufgebaut ist, dass es über viele Partitionen / Shards / Server skaliert. DynamoDB unterstützt aufgrund von Skalierungsbeschränkungen keine automatisch inkrementierten Primärschlüssel und kann nicht auf mehreren Servern garantiert werden.
Die bessere Option besteht darin, den Primärschlüssel aus mehreren Indizes zusammenzusetzen. Der Primärschlüssel kann bis zu 2048 Byte betragen. Es gibt nur wenige Optionen:
Der folgende Code erhöht den Zähler in DynamoDB automatisch und kann dann als Primärschlüssel verwendet werden.
var documentClient = new AWS.DynamoDB.DocumentClient();
var params = {
TableName: 'sampletable',
Key: { HashKey : 'counters' },
UpdateExpression: 'ADD #a :x',
ExpressionAttributeNames: {'#a' : "counter_field"},
ExpressionAttributeValues: {':x' : 1},
ReturnValues: "UPDATED_NEW" // ensures you get value back
};
documentClient.update(params, function(err, data) {});
// once you get new value, use it as your primary key
Mein persönlicher Favorit ist die Verwendung von Zeitstempel + Zufall, inspiriert von der Sharding ID-Generierung von Instagram unter http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram
Die folgende Funktion generiert eine ID für einen bestimmten Shard (als Parameter bereitgestellt). Auf diese Weise können Sie einen eindeutigen Schlüssel erhalten, der aus dem Zeitstempel, Splitter Nr. und etwas Zufälligkeit (0-512).
var CUSTOMEPOCH = 1300000000000; // artificial epoch
function generateRowId(shardId /* range 0-64 for shard/slot */) {
var ts = new Date().getTime() - CUSTOMEPOCH; // limit to recent
var randid = Math.floor(Math.random() * 512);
ts = (ts * 64); // bit-shift << 6
ts = ts + shardId;
return (ts * 512) + randid;
}
var newPrimaryHashKey = "obj_name:" + generateRowId(4);
// output is: "obj_name:8055517407349240"
subId
es sich um eine Shard-ID handeln oder so?
var randid = Math.floor(Math.random() * 512); ... randid % 512
sollte eine Zahl zwischen 0 und 511 in der ersten Zeile angeben . Die Verwendung von Modulo 512 für eine solche Nummer ändert die Nummer nicht.
Sie können wahrscheinlich AtomicCounters verwenden .
Mit AtomicCounters können Sie die UpdateItem-Operation verwenden, um einen Atomzähler zu implementieren - ein numerisches Attribut, das bedingungslos erhöht wird, ohne andere Schreibanforderungen zu beeinträchtigen. (Alle Schreibanforderungen werden in der Reihenfolge angewendet, in der sie empfangen wurden.) Bei einem Atomzähler sind die Aktualisierungen nicht idempotent. Mit anderen Worten, der numerische Wert erhöht sich jedes Mal, wenn Sie UpdateItem aufrufen.
Sie können einen Atomzähler verwenden, um die Anzahl der Besucher einer Website zu verfolgen. In diesem Fall würde Ihre Anwendung einen numerischen Wert unabhängig von seinem aktuellen Wert erhöhen. Wenn ein UpdateItem-Vorgang fehlschlägt, kann die Anwendung den Vorgang einfach wiederholen. Dies würde dazu führen, dass der Zähler zweimal aktualisiert wird, aber Sie könnten wahrscheinlich eine leichte Über- oder Unterzählung von Website-Besuchern tolerieren.
Wenn Sie NoSQL Dynamo DB verwenden und dann Dynamoose verwenden, können Sie einfach die eindeutige Standard-ID festlegen. Hier ist das einfache Beispiel für die Benutzererstellung
// User.modal.js
const dynamoose = require("dynamoose");
const { v4: uuidv4 } = require("uuid");
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
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);
};