2015-09-25 3 views
14

Diciamo che io sono la memorizzazione record con seguente struttura in DynamoDB:È possibile eseguire una put condizionale o un aggiornamento in DynamoDB?

{  
    "id": "57cf5b43-f9ec-4796-9de6-6a50f556cfd8", 
    "created_at": "2015-09-18T13:27:00+12:00", 
    "count": 3 
} 

Ora, è possibile raggiungere i seguenti obiettivi in ​​una sola richiesta:

  • se il record con data id non lo fa esiste dovrebbe essere creato con count = 1
  • se il record per quello id esiste il contatore viene aggiornato.

Attualmente sto facendo una query per verificare se il record esiste e in base al risultato faccio un put o un update. Sarebbe bello piegarlo in un'unica operazione.

risposta

11

È possibile eseguire questa operazione con l'API UpdateItem e lo UpdateExpression a causa del caso d'uso. Dal momento che count sarà un tipo Number qui, è possibile utilizzare i SET o ADD espressioni:

La documentazione per ADD ti dice che si può utilizzare per Number tipi (sottolineatura mia):

  • AGGIUNGI - Aggiunge il valore specificato all'elemento, se l'attributo non esiste già. Se l'attributo esiste, allora il comportamento di ADD dipende dal tipo di dati dell'attributo:

    • se l'attributo esistente è un numero, e se Valore è anche un numero, quindi Valore è matematicamente aggiunto all'attributo esistente. Se il valore è un numero negativo, viene sottratto dall'attributo esistente.

    Se si utilizza ADD per incrementare o decrementare un valore numerico per un elemento che non esiste prima dell'aggiornamento, DynamoDB usa 0 come valore iniziale. Analogamente, se si utilizza ADD per un elemento esistente per incrementare o decrementare un valore di attributo che non esiste prima dell'aggiornamento, DynamoDB utilizza 0 come valore iniziale. Ad esempio, si supponga che l'elemento che si desidera aggiornare non abbia un attributo denominato itemcount, ma si decide di AGGIUNGERE comunque il numero 3 a questo attributo. DynamoDB creerà l'attributo itemcount, imposterà il suo valore iniziale a 0 e infine aggiungerà 3 ad esso. Il risultato sarà un nuovo attributo ItemCount nella voce, con un valore pari a 3.

Per esempio, si potrebbe avere il UpdateExpression essere ADD #c :n, dove :n ha un ExpressionAttributeValue del tipo Number, 1 è il valore e #c ha la sostituzione ExpressionAttributeName per count. È necessario utilizzare un segnaposto per count perché è un reserved word.

Vedere ulteriori esempi sul Modifying Items and Attributes with Update Expressions

7

Quello che non ho menzionato nella mia domanda era che io volevo il count salire per eventi successivi senza modificare la created_at. Il mio ultimo UpdateInput funzionante è il seguente:

{ 
    Key: { 
    id: { 
     S: "some_unique_id" 
    } 
    }, 
    TableName: "test", 
    ExpressionAttributeNames: { 
    #t: "created_at", 
    #c: "count" 
    }, 
    ExpressionAttributeValues: { 
    :t: { 
     S: "2015-09-26T15:58:57+12:00" 
    }, 
    :c: { 
     N: "1" 
    } 
    }, 
    UpdateExpression: "SET #t = if_not_exists(#t, :t) ADD #c :c" 
}