2015-10-22 10 views
7

È necessario aggiungere una stringa a una stringa impostata in una tabella dynamodb utilizzando la chiave corrispondente. Questa è l'espressione di aggiornamento che uso per fare updateItem:DynamoDB: SET list_append non funziona utilizzando aws sdk

var params = { 
    "TableName" : tableName, 
    "Key": { 
     "ID": { 
     S: "20000" 
     } 
    }, 
    "UpdateExpression" : "SET #attrName = list_append(#attrName, :attrValue)", 
    "ExpressionAttributeNames" : { 
     "#attrName" : "entries" 
    }, 
    "ExpressionAttributeValues" : { 
     ":attrValue" : {"SS":["000989"]} 
    } }; 

Questo funziona quando faccio updateItem() utilizzando AWS cli. Ma quando si utilizza aws-sdk in nodejs, ricevo l'errore:

Invalid UpdateExpression: Incorrect operand type for operator or function; operator or function: list_append, operand type: M\n 

Qualsiasi aiuto? Grazie

+4

Hai provato la modifica del valore di: ATTRVALUE a '{ "L": [{ "S": "000.989" }]} ' –

+0

In alternativa, qual è il tipo di' voci' nella tabella? –

risposta

17

list_append può essere letto come un'operazione "concatenata". Dagli solo due liste.

"UpdateExpression" : "SET #attrName = list_append(#attrName, :attrValue)", 
"ExpressionAttributeNames" : { 
    "#attrName" : "entries" 
}, 
"ExpressionAttributeValues" : { 
    ":attrValue" : ["000989"] 
} 

Vale la pena ricordare che le liste (e mappe) in DynamoDB non vengono digitati e in grado di memorizzare dati arbitrari.

Nota a margine: Armati di questa conoscenza, the documentation sulla aggiungendo all'inizio della lista ora ha un senso:

list_append (operand, operand)

This function evaluates to a list with a new element added to it. You can append the new element to the start or the end of the list by reversing the order of the operands.

+1

Questo l'ha fatto per me, grazie. La cosa importante da notare è che list_append occupa due elenchi: 'list_append ([list1], [list2])'. Qualcos'altro errore. Quindi se passi un oggetto/mappa (come stavo tentando di fare), devi avvolgere quell'oggetto in una lista: [{object}] – samcorcos

2

C'è una risposta accettata su questa questione che mi ha aiutato con una parte di questo problema. Tuttavia, in genere vorremmo aggiornare gli elenchi con ulteriori oggetti , non con stringhe. Per questo, ho trovato utile evitare di usare ExpressionAttributeNames se possibile.

1) Assicurarsi che il valore nel proprio articolo nella tabella DynamoDB sia un elenco. 2) Assicurarsi che si passa in un elenco di oggetti (anche se si dispone di una sola), non è un semplice oggetto

  UpdateExpression: "set pObj.cObj= list_append(pObj.cObj, :obj)", 
      ExpressionAttributeValues: { 
       ":obj": [ 
        {myObject: { 
         property1: '', 
         property2: '', 
         property3: '', 

        }} 
       ] 
      }, 
+0

Grazie mille per questa risposta. State cercando come aggiornare elenchi con oggetti per così tanto tempo – CuriousCoder

0

forse questo aiuterà qualcuno. stavo lottando con l'aggiornamento di un elenco e ricevevo lo stesso messaggio di errore del poster originale. sono riuscito a risolvere il mio problema quando ho finalmente capito la documentazione (vedi l'esempio Aggiungere elementi ad un elenco qui http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html#Expressions.UpdateExpressions.ADD)

i punti da notare sono: 1) che "list_append prende due liste come input e aggiunge il secondo elenco al primo. " e 2) che ExpressionAttributeValues ​​è una lista! in questo modo:

{ 
":vals": { 
    "L": [ 
     { "S": "Screwdriver" }, 
     {"S": "Hacksaw" } 
    ] 
} 

}

buona fortuna!

1

Ho pensato di buttarlo qui come un'altra opzione per aggiungere o aggiungere un "oggetto" a un elenco. E 'una mappa che si aggiunge un elemento alla lista, e ha funzionato bene per me:

var upsertExpr = (obj.comments == undefined) ? " :attrValue" : "list_append(#attrName, :attrValue)"; 

var params = { 
    TableName: 'tableName', 
    Key: { 
     'id': {'S': id}, 
    }, 
    UpdateExpression : "SET #attrName = " + upsertExpr, 
    ExpressionAttributeNames : { 
     "#attrName" : "comments" 
    }, 
    ExpressionAttributeValues : { 
     ":attrValue" : { 
      "L": [ 
       { "M" : 
        { 
         "comment": {"S": comment}, 
         "vote": {"N": vote.toString()} 
        } 
       } 
      ] 
     } 
    } 
}; 
Problemi correlati