2017-11-02 3 views
0

Ich habe eine Lambda-Funktion, die als Trigger auf einer Tabelle mit den besten Ergebnissen von Benutzern für eine Leaderboard-Tabelle fungiert.Wie lösche Eintrag in dynamodb Liste?

In meiner Leaderboard-Tabelle ist der Sortierschlüssel der Punktestand, und der Name des Spielers ist ein separater Eintrag mit einer Liste, weil es möglich ist, dass es mehr als einen Spieler mit der gleichen Punktzahl gibt. Vergiss es.

Also, wenn ein Spieler das Hinzufügen ich tun:

var paramsNewEntry = { 
      "TableName": leaderboardTable, 
      "Key": { 
       "trackId": trackId, 
       "time": newValue 
      }, 
      "UpdateExpression": "SET players = list_append(if_not_exists(players, :emptyList), :playersList), 
      "ExpressionAttributeValues": { 
       ":playersList": [userId], 
       ":emptyList":[] 
      }, 
      "ReturnValues": "NONE" 
     }; 

Und das funktioniert gut. Ich wollte es auf diese Weise entfernen:

var paramsOldEntry = { 
        "TableName": myTable, 
        "Key": { 
         "trackId": trackId, 
         "time": oldValue 
        }, 
        "UpdateExpression": "DELETE players :playerToRemove", 
        "ExpressionAttributeValues": { 
         ":playerToRemove": [userId] 
        }, 
        "ReturnValues": "ALL_NEW" 
       } 

Aber ich bekomme: Invalid UpdateExpression: Incorrect operand type for operator or function; operator: DELETE, operand type: LIST Fehler.

Das players Attribut ist eine Liste, Abfrage-Antwort Beispiel:

{ 
    "Items": [ 
    { 
     "time": { 
     "N": "99994" 
     }, 
     "players": { 
     "L": [ 
      { 
      "S": "krystianPostman2" 
      } 
     ] 
     }, 
     "trackId": { 
     "S": "betaTrack001" 
     } 
    } 
    ], 
    "Count": 1, 
    "ScannedCount": 1, 
    "LastEvaluatedKey": { 
    "time": { 
     "N": "99994" 
    }, 
    "trackId": { 
     "S": "betaTrack001" 
    } 
    } 
} 

Ich habe keine Frage auf SO gesehen, die auf diese eventuell in Javascript bieten würde, wenn die DynamoDB Document API.

+0

Sie benötigen nur einen Eintrag aus der Liste zu löschen, wenn es mehrere Werte hat? – notionquest

+0

ist es egal, löschen Sie einfach den angegebenen Eintrag. Es ist immer eine Liste, wenn die Liste keine anderen Werte hat, nachdem ich die letzte entfernt habe, werde ich das in den Antwortdaten erkennen und den Eintrag vollständig entfernen. – Krystian

+0

Ich würde mich über einen Kommentar freuen, wenn ich meine Frage ablehne. Warum der Downvote? War es unangemessen? Mangel an Beispielen/Codebeispielen? – Krystian

Antwort

3

Die DynamoDB-API verfügt nicht über eine Option zum Löschen des Werts aus dem LIST-Datentyp basierend auf seinem Wert. Wenn Sie jedoch den Index des zu löschenden Werts kennen, können Sie den Eintrag aus der Liste mit REMOVE löschen.

Die DELETE-Aktion unterstützt nur Set-Datentypen.

UpdateExpression: 'REMOVE players[0]' 

Wenn die Liste nur name Attribut haben wird, ist es besser, es zu speichern als anstatt LIST DynamoDB Datentyp SET.

Erstellen Set: -

var docClient = new AWS.DynamoDB.DocumentClient(); 
docClient.createSet(["v1", "v2"]); 

Deleting the values from SET using DELETE

+0

Wie wäre es, wenn ich den Wert so ändere, wie er gespeichert wird? Wird dann das DELETE funktionieren? Ich bin dabei, alles umzuschreiben, um damit fertig zu werden, aber wenn ich im Voraus wissen würde, dass es nicht hilft, würde ich meine Zeit nicht verschwenden. – Krystian

+0

Ja, Sie können das Element aus SET löschen. Der Referenzlink, der auch einige Beispiele enthält, wurde hinzugefügt. – notionquest

+0

Ja, Sir es tut. Ich habe alles verändert und es ist perfekt. – Krystian

Verwandte Themen