Mi tabla de DynamoDB tiene una clave principal como id . El mismo id se utilizará para consultar un registro.
Ahora quiero insertar un registro con id y URL originalURL como atributos, quiero insertar este registro si y solo si la id y la URL originalURL no existen en la tabla.
Actualización: - ConditionExpression: "attribute_not_exists(id) AND attribute_not_exists(originalURL)" solo funcionará en el contexto de la clave principal, de acuerdo con los documentos (puede realizar una operación de colocación condicional (agregue un nuevo elemento si uno con la clave principal especificada no 't exist) , por lo que attribute_not_exists(originalURL) está allí o no, no hace la diferencia. Entonces necesito una solución donde ambas condiciones funcionen o la URL original también actúe como una clave
router.post('/', async function (req, res, next) { urlId = await nanoid(8); //const hashids = new Hashids('this is my salt') //urlId=hashids.encode(1) console.log('jatin', urlId); // urlId=uuidv4(); const { longURL } = req.body const params = { TableName: 'url', Item: { "id": urlId, "originalURL": longURL }, UpdateExpression: "set originalURL = :y", ConditionExpression: "attribute_not_exists(id) AND attribute_not_exists(originalURL)" } dynamoDb.put(params, (error, data) => { if (error) { console.log(error); res.status(400).json({ error: error }); } else if (Object.keys(data).length === 0 && data.constructor === Object) { res.status(200).json( { urlId, longURL, status: 'success' }) } else { res.status(400).json({ error: 'Please try again' }); } }) });a partir de ahora, incluso si intento enviar una solicitud con la misma URL original que ya está presente, agrega con éxito el registro que no quiero.
Para putItem api puede tener expresiones condicionales. Según el doc.
CondiciónExpresión
Una condición que debe cumplirse para que una operación PutItem condicional tenga éxito.
Una expresión puede contener cualquiera de los siguientes:
Funciones: atributo_existe | atributo_no_existe | tipo_atributo | contiene | comienza_con | Talla
Estos nombres de funciones distinguen entre mayúsculas y minúsculas.
Operadores de comparación: = | <> | < | > | <= | >= | ENTRE | EN
Operadores lógicos: Y | O | NO
Para obtener más información sobre las expresiones de condición, consulte Expresiones de condición en la Guía para desarrolladores de Amazon DynamoDB.
Tipo: Cuerda
Requerido: No
también se ha explicado el mismo escenario en este documento: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html#Expressions.ConditionExpressions.PreventingOverwrites
La operación PutItem sobrescribe un elemento con la misma clave (si existe). Si desea evitar esto, utilice una expresión de condición. Esto permite que la escritura continúe solo si el elemento en cuestión aún no tiene la misma clave.
aws dynamodb put-item \ --table-name ProductCatalog \ --item file://item.json \ --condition-expression "attribute_not_exists(Id)"
Comprueba si esto resuelve el problema.
import { marshall } from "@aws-sdk/util-dynamodb"; const params = { TableName: 'url', Item: { "id": urlId, "originalURL": longURL }, ExpressionAttributeValue: marshal({ ":originalURL": originalURLVariable ":id": idVariable }), ConditionExpression: "id <> :id AND originalURL <> :originalURL", UpdateExpression: "set originalURL = :originalURL", }