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
quelle
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"
quelle
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 .
quelle
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
// User.controller.js
quelle