UpdateItem - AWS AppSync

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

UpdateItem

La UpdateItem richiesta consente di indicare alla funzione AWS AppSync DynamoDB di effettuare una UpdateItem richiesta a DynamoDB e consente di specificare quanto segue:

  • La chiave dell'elemento in DynamoDB

  • Un'espressione di aggiornamento che descrive come aggiornare l'elemento in DynamoDB

  • Condizioni per la riuscita dell'operazione

La UpdateItem richiesta ha la seguente struttura:

type DynamoDBUpdateItemRequest = { operation: 'UpdateItem'; key: { [key: string]: any }; update: { expression: string; expressionNames?: { [key: string]: string }; expressionValues?: { [key: string]: any }; }; condition?: ConditionCheckExpression; customPartitionKey?: string; populateIndexFields?: boolean; _version?: number; };

I campi sono definiti come segue:

UpdateItem campi

operation

L'operazione DynamoDB da eseguire. Per eseguire l'operazione UpdateItem DynamoDB, il valore deve essere impostato su UpdateItem. Questo valore è obbligatorio.

key

La chiave dell'elemento in DynamoDB. Gli elementi DynamoDB possono avere una sola chiave hash o una chiave hash e una chiave di ordinamento, a seconda della struttura della tabella. Per ulteriori informazioni sulla specificazione di un «valore digitato», consulta Sistema di tipi (mappatura delle richieste). Questo valore è obbligatorio.

update

La update sezione consente di specificare un'espressione di aggiornamento che descrive come aggiornare l'elemento in DynamoDB. Per ulteriori informazioni su come scrivere espressioni di aggiornamento, consulta la documentazione di UpdateExpressions DynamoDB. Questa sezione è obbligatoria.

La sezione update ha tre componenti:

expression

L'espressione di aggiornamento. Questo valore è obbligatorio.

expressionNames

Le sostituzioni per i segnaposto dell'attributo di espressione name sotto forma di coppie chiave-valore. La chiave corrisponde a un segnaposto per il nome utilizzato inexpression, e il valore deve essere una stringa corrispondente al nome dell'attributo dell'elemento in DynamoDB. Questo è un campo facoltativo in cui vanno riportate solo le sostituzioni per i segnaposto dell'attributo di espressione name utilizzate in expression.

expressionValues

Le sostituzioni per i segnaposto dell'attributo di espressione value sotto forma di coppie chiave-valore. La chiave corrisponde a un segnaposto per un valore utilizzato in expression, mentre il valore deve essere un valore tipizzato. Per ulteriori informazioni su come specificare un «valore digitato», consulta Type system (request mapping). Questo elemento deve essere specificato. Questo è un campo facoltativo in cui vanno riportate solo le sostituzioni per i segnaposto dell'attributo di espressione value utilizzate in expression.

condition

Una condizione per determinare se la richiesta deve riuscire o no in base allo stato dell'oggetto già incluso in DynamoDB. Se non viene specificata alcuna condizione, la richiesta UpdateItem aggiorna qualsiasi valore esistente, indipendentemente dal suo stato attuale. Per ulteriori informazioni sulle condizioni, vedere Espressioni di condizione. Questo valore è facoltativo.

_version

Valore numerico che rappresenta l'ultima versione nota di un elemento. Questo valore è facoltativo. Questo campo viene utilizzato per il rilevamento dei conflitti ed è supportato solo nelle origini dati con versione.

customPartitionKey

Se abilitato, questo valore di stringa modifica il formato dei ds_pk record ds_sk and utilizzati dalla tabella delta sync quando il controllo delle versioni è abilitato (per ulteriori informazioni, consulta Conflict detection and sync nella AWS AppSync Developer Guide). Se abilitata, è abilitata anche l'elaborazione della populateIndexFields voce. Questo campo è facoltativo.

populateIndexFields

Un valore booleano che, se abilitato insieme acustomPartitionKey, crea nuove voci per ogni record nella tabella delta sync, in particolare nelle colonne gsi_ds_pk andgsi_ds_sk. Per ulteriori informazioni, consulta Rilevamento e sincronizzazione dei conflitti nella Guida per gli AWS AppSync sviluppatori. Questo campo è facoltativo.

L'elemento aggiornato in DynamoDB viene automaticamente convertito in GraphQL e tipi primitivi JSON ed è disponibile nel contesto result (). context.result

Per ulteriori informazioni sulla conversione dei tipi in DynamoDB, vedere Sistema dei tipi (mappatura delle risposte).

Per ulteriori informazioni sui JavaScript resolver, consulta la panoramica dei resolver. JavaScript

Esempio 1

L'esempio seguente è un gestore di richieste di funzioni per la mutazione upvote(id: ID!) GraphQL.

In questo esempio, un elemento in DynamoDB ha i upvotes suoi campi version e incrementati di 1.

import { util } from '@aws-appsync/utils'; export function request(ctx) { const { id } = ctx.args; return { operation: 'UpdateItem', key: util.dynamodb.toMapValues({ id }), update: { expression: 'ADD #votefield :plusOne, version :plusOne', expressionNames: { '#votefield': 'upvotes' }, expressionValues: { ':plusOne': { N: 1 } }, }, }; }

Esempio 2

L'esempio seguente è un gestore di richieste di funzioni per una mutazione updateItem(id: ID!, title: String, author: String, expectedVersion: Int!) GraphQL.

Si tratta di un esempio complesso che verifica gli argomenti e genera dinamicamente l'espressione di aggiornamento in cui sono inclusi solo gli argomenti forniti dal client. Ad esempio, se title e author vengono omessi, non vengono aggiornati. Se viene specificato un argomento ma il suo valore ènull, quel campo viene eliminato dall'oggetto in DynamoDB. Infine, l'operazione ha una condizione, che verifica se l'elemento attualmente in DynamoDB ha version il campo impostato su: expectedVersion

import { util } from '@aws-appsync/utils'; export function request(ctx) { const { args: { input: { id, ...values } } } = ctx; const condition = { id: { attributeExists: true }, version: { eq: values.expectedVersion }, }; values.expectedVersion += 1; return dynamodbUpdateRequest({ keys: { id }, values, condition }); } /** * Helper function to update an item * @returns an UpdateItem request */ function dynamodbUpdateRequest(params) { const { keys, values, condition: inCondObj } = params; const sets = []; const removes = []; const expressionNames = {}; const expValues = {}; // Iterate through the keys of the values for (const [key, value] of Object.entries(values)) { expressionNames[`#${key}`] = key; if (value) { sets.push(`#${key} = :${key}`); expValues[`:${key}`] = value; } else { removes.push(`#${key}`); } } let expression = sets.length ? `SET ${sets.join(', ')}` : ''; expression += removes.length ? ` REMOVE ${removes.join(', ')}` : ''; const condition = JSON.parse( util.transform.toDynamoDBConditionExpression(inCondObj) ); return { operation: 'UpdateItem', key: util.dynamodb.toMapValues(keys), condition, update: { expression, expressionNames, expressionValues: util.dynamodb.toMapValues(expValues), }, }; }

Per ulteriori informazioni su DynamoDB, consulta la documentazione di UpdateItem API DynamoDB. API