2015-06-02 5 views
8

Ho cercato di capire come aggiornare un elemento in dynamoDB ma non ho avuto alcun successo.non è possibile aggiornare l'articolo in DynamoDB

So come aggiungere e elemento e rimuovere un elemento ma non aggiornare.

Ecco il mio codice:

dynamoDB.updateItem({ 
    "TableName": "mytable", 
    "Key": { 
     "thing_ID": {"S": "0000"} 
    }, 
    "UpdateExpression": "SET", 
    "ExpressionAttributeNames": { 
     "SessionID": "" 
    }, 
    "ExpressionAttributeValues": { 
     "SessionID": { 
      "S": "maybe this works", 
     } 
    } 
}) 

risposta

11

Sembra che si sta tentando di aggiornare un oggetto utilizzando un Expression, e in questo caso, il vostro UpdateExpression non è corretto. Entrambi i modelli ExpressionAttributeNames e vengono utilizzati per placeholder substitution nell'espressione.

penso che il codice sarebbe simile a questo, se si desidera impostare un attributo per un elemento:

dynamoDB.updateItem({ 
    "TableName" : "exampleTable", 
    "Key" : { 
     "hashAttributeName" : { 
      "S" : "thing_ID" 
     } 
    }, 
    "UpdateExpression" : "SET #attrName =:attrValue", 
    "ExpressionAttributeNames" : { 
     "#attrName" : "SessionID" 
    }, 
    "ExpressionAttributeValues" : { 
     ":attrValue" : { 
      "S" : "maybe this works" 
     } 
    } 
}); 

Questo aggiornerà un oggetto che assomiglia a questo:

{ 
    "Item":{ 
     "hashAttributeName":"thing_ID" 
    } 
} 

Per this:

{ 
    "Item":{ 
     "hashAttributeName" : "thing_ID", 
     "SessionID" : "maybe this works" 
    } 
} 
+0

Come posso fare questo se voglio aggiornare più Arrtibutes? Puoi per favore aiutare? – Karthik

+1

@Karthik Il tuo 'UpdateExpression' ha solo più attributi. Come 'SET Brand =: b, Price =: p'. Se vuoi fare più azioni diverse (come 'SET' e' REMOVE') puoi farlo anche tu. Guarda [* Modifica articoli e attributi con Update Expressions *] (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.Modifying.html), e poni una nuova domanda in caso di problemi. – mkobit

+0

grazie mille. – Karthik

0

Ecco un esempio utilizzando AWS SDK per JavaScript v2.1.33.

L'esempio completo è qui: https://github.com/mayosmith/HelloDynamoDB/blob/master/HelloDynamoDB.html

/* 
----------------------------------------------------------------- 
AWS configure 
Note: this is a simple experiement for demonstration 
purposes only. Replace the keys below with your own. 
Do not include the secret key in an actual production 
environment, because, then, it wont be secret anymore... 
----------------------------------------------------------------- 
*/ 
AWS.config.update({accessKeyId: 'AKIAJUPWRIYYQGDB6AFA', secretAccessKey: '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'}); 
// Configure the region 
AWS.config.region = 'us-west-2'; //us-west-2 is Oregon 
//create the ddb object 
var ddb = new AWS.DynamoDB(); 
/* 
----------------------------------------------------------------- 
Update the Table 
----------------------------------------------------------------- 
*/ 
//update the table with this data 
var params = { 
    Key: { 
    name: {S: 'John Mayo-Smith'}, 
    city: {S: 'New York'} 
    }, 
    AttributeUpdates: { 
    food: { 
     Action: 'PUT', 
     Value: {S: 'chocolate'} 
    } 
    }, 
    TableName: 'sampletable', 
    ReturnValues: 'ALL_NEW' 
}; 
//update the table 
update(); 
/* 
----------------------------------------------------------------- 
Get Item from the Table 
----------------------------------------------------------------- 
*/ 
//attribute to read 
var readparams = { 

    Key: { 
    name: {S: 'John Mayo-Smith'}, 
    city: {S: 'New York'} 
    }, 
    AttributesToGet: ['food'], 
    TableName: 'sampletable' 
}; 
//get the item 
read(); 
/* 
----------------------------------------------------------------- 
function update() 
Description: Calls updateItem which is part of the AWS Javascript 
SDK. 
Returns: JSON object (the object is stringifyed so we can see 
what's going on in the javascript console) 
----------------------------------------------------------------- 
*/ 
function update(){ 
    ddb.updateItem(params, function(err, data) { 
     if (err) { return console.log(err); } 
     console.log("We updated the table with this: " + JSON.stringify(data)); 
    }); 
} 
/* 
----------------------------------------------------------------- 
function read() 
Description: Calls getItem which is part of the AWS Javascript 
SDK. 
Returns: JSON object (the object is stringifyed so we can see 
what's going on in the javascript console) 
----------------------------------------------------------------- 
*/ 
function read(){ 
    ddb.getItem(readparams, function(err, data) { 
     if (err) { return console.log(err); } 
     console.log(": " + data);  

    console.log("John's favorite food is: "+ JSON.stringify(data.Item.food.S)); // print the item data 
}); 
} 
+2

Per coloro che ricevono un errore quando usano AttributeUpdates. Dovrebbero utilizzare l'approccio evidenziato da mkobit poiché "AttributeUpdates" è un parametro precedente e non funzionerebbe con i nuovi parametri. Tuttavia, sarebbe bello se qualcuno potesse suggerire un approccio più semplice poiché la creazione degli oggetti ExpressionAtrribute ed ExpressionValue è noiosa quando si desidera automatizzare questo – Kartik

+0

@Kartik per quanto posso dire che non esiste un approccio più semplice. Ecco uno snippet che automatizza la creazione dei parametri richiesti: https://gist.github.com/cmawhorter/1fe025393efc2545b2c7 –

+0

@CoryMawhorter Sembra fantastico! In realtà sono andato avanti e ho scritto un wrapper attorno alla libreria DynamoDB per rendere semplici le funzioni di supporto che rendono più semplici i banali task DynamoDB, e lo hanno reso promettente basato: D. La libreria si chiama Dynosaur (https://github.com/kartiklad/dynosaur), non ha alcuna documentazione atm ma il codice ha alcuni commenti di base in esso – Kartik

0

Di seguito il codice sta lavorando per me, provare una volta

var item = {"endTime": "7pm", "imageName": "7abcd", "startTime": "7pm"}; 

dynamo.updateItem({ 
TableName:'tableName', 
Key:{"primaryKey":"primaryKeyValue"}, 
AttributeUpdates: { images: { Action: "ADD", Value: item } }},function(err, data) { 
    if (err) 
     console.log(err); 
    else 
     console.log(data) 
});