2016-03-01 12 views
8

Mi piacerebbe "caricare" un documento in DynamoDB. Cioè, vorrei specificare una chiave e un insieme di coppie campo/valore. Se non esiste alcun documento con quella chiave, non ne creerò uno creato con quella chiave e le coppie chiave/valore che ho specificato. Se un documento esiste con quella chiave, voglio che i campi che ho specificato siano impostati sui valori specificati (se quei campi non esistevano prima, allora dovrebbero essere aggiunti). Qualsiasi altro campo non specificato sul documento esistente dovrebbe essere lasciato in pace.È possibile eseguire l'upsert dei campi nidificati in DynamoDB?

Sembra che io possa fare abbastanza bene con la chiamata UpdateItem, quando le coppie campo/valore che sto impostando sono tutti campi di livello superiore. Se ho strutture nidificate, UpdateItem funzionerà per impostare i campi nidificati, purché esista la struttura. In altre parole, se il mio documento esistente ha "foo": {}, allora posso impostare con successo "foo.bar": 42.

Tuttavia, non riesco a impostare "foo.bar": 42 se non è già presente l'oggetto foo (come nel caso in cui non vi è alcun documento con il campo specificato e il mio "upsert" si sta comportando come un 'insert'.

Ho trovato a discussion nei forum AWS di alcuni anni fa, il che sembra implicare che ciò che voglio fare non può essere fatto, ma spero che questo sia cambiato di recente, o forse qualcuno sa di modo per farlo?

+1

Per darvi un altro punto dati, ho guardato in questo nel maggio 2015 (ish) e lo stesso problema che hai menzionato esisteva ancora. Non ero in grado di raggiungere l'obiettivo di nested campo inverso, quindi ho dovuto cambiare il mio approccio al problema e come ho memorizzato i dati. – mkobit

+0

@mkobit grazie per il tuo punto dati; questa è la conclusione a cui sono arrivato. Poiché i miei dati avevano un numero fisso di livelli nidificati, ho finito per archiviarlo appiattito, con campi denominati come 'foo_bar', e ho aggiunto il codice di marshalling/unmarshalling al mio livello DAO per tradurlo. È un dolore, ma sembra funzionare abbastanza bene (almeno finora) – pkaeding

+2

Lo stesso problema un anno dopo. La parte fastidiosa è che Dynamo non genera un errore, semplicemente non salva quella porzione dell'albero dei dati. – Jelling

risposta

0

UpdateItem si comporta come un'operazione "upsert": l'elemento viene aggiornato se esiste nella tabella , ma in caso contrario, viene aggiunto un nuovo elemento (inserito). http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.UpdateData.html

+2

Sì, l'ho letto. Ma se leggi la mia domanda, non sono in grado di spostare oggetti nidificati. – pkaeding

+0

L'ho usato con oggetti nidificati e ha funzionato (con DynamoDBMapper). http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html – Neil

0

That ("foo.bar": 42) può essere raggiunto utilizzando la query di seguito:

table.update_item(Key = {'Id' : id}, 
       UpdateExpression = 'SET foo = :value1', 
       ExpressionAttributeValues = {':value1': {'bar' : 42}} 
      ) 

Spero che questo aiuti :)

+0

ma se il valore iniziale di 'foo' aveva altre chiavi, oltre alla' bar' valore che si sta aggiornando, non sarebbe perso? Ad esempio, se il valore iniziale era '{foo: {biz: 33, bar: 0}}' e vuoi cambiare solo 'foo.bar', lasciando invariato il resto dell'oggetto' foo', funzionerebbe? – pkaeding

+0

Ho risposto a una domanda simile a questa. https://stackoverflow.com/questions/35569733/how-to-adding-an-empty-or-data-map-in-dynamodb/46791740#46791740 Si prega di controllare e commentare che se funziona. – manojpt