2015-12-02 2 views
10

Ich habe folgende Liste Beispiel:Wie lösche ich aus der DynamoDB-Liste der Karten den Map-Attributwert in der Liste?

{ 
    "favorites": [ 
    { 
     "createdAt": 1448998673852, 
     "entityId": "558da3de395b1aee2d6b7d2b", 
     "type": "media" 
    }, 
    { 
     "createdAt": 1448998789252, 
     "entityId": "558da3de395b1aee2d6b7d83", 
     "type": "media" 
    }, 
    { 
     "createdAt": 1448998793729, 
     "entityId": "558da3de395b1aee2d6b7d99", 
     "type": "media" 
    }, 
    { 
     "createdAt": 1448998813023, 
     "entityId": "558da3de395b1aee2d6b7daf", 
     "type": "media" 
    } 
    ], 
    "userId": "2" 
} 

Und ich möchte mit der Karte entfernen: "entityId": "558da3de395b1aee2d6b7d2b".

ich eine UpdateItem Abfrage denke, ich habe bei REMOVE Ausdruck Dokumentation (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.Modifying.html) gesucht, aber ich kann keine Beispiele zu sehen scheinen, über Elemente aus einer Liste von Indexwert zu entfernen ....

+0

Ich stehe vor einem ähnlichen Problem. Hast du eine Lösung dafür gefunden? –

+0

Dito. Ich habe auch Probleme. – ephemeralCoder

Antwort

-1

Sie sollten das Objekt in etwas serialisieren, mit dem Sie arbeiten können, es ändern, um diesen Eintrag zu entfernen, und dann update-item verwenden, um die Änderungen zu speichern.

Ich bin kein node.js Benutzer, aber wie haben Sie das Objekt überhaupt erstellt? Handelst du die JSON-Schnur? Wenn ja, solltest du nicht sein. Es gibt Bibliotheken, die json handhaben und es Ihnen leicht machen, sie zu modifizieren und dann die resultierende json-Zeichenkette mit den Änderungen zu erhalten.

How to parse JSON using Node.js?

+1

Das Problem mit dem hier vorgeschlagenen Ansatz ist, dass es nicht atomar ist. Wenn zwei Clients das Element ungefähr zur selben Zeit lesen, wenn beide das Element zurückschreiben, ist eine der Änderungen verloren. – sheldonh

+0

Das beantwortet die Frage des Entfernens eines Elements aus der Liste in DynamoDB nicht durch ein anderes Merkmal als die Position in einer Liste. – Juriy

1

Ich habe jetzt ein paar Mal in diesem Thema laufen, und leider gibt es keine einfache Lösung. Die beiden häufigsten Abhilfen ich begegnet bin, sind:

A. eine Karte verwenden statt einer Liste können Sie den Favoriten direkt in Ihrem Update Ausdruck jetzt Referenz #favorites.#entityId verwenden. Wenn die Reihenfolge wichtig ist, fügen Sie jeder Karte ein Bestellattribut hinzu. In Ihrer Datenzugriffsebene müssen Sie Ihre Conversions zum/vom gewünschten Array-Typ durchführen.

{ 
    "userId": "2", 
    "favorites": { 
    "558da3de395b1aee2d6b7d2b": { 
     "createdAt": 1448998673852, 
     "entityId": "558da3de395b1aee2d6b7d2b", 
     "type": "media", 
    }, 
    // ... more entities here 
    } 
} 

B. eine Eins-zu-viele-Tabellen verwenden statt finden http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForItems.html

0

Ich habe das schon mal gemacht in Python die Boto3 Bibliothek, aber nicht in Javascript. Ich habe eine link Javascript Funktion Element löschen. Was ich in Python gemacht habe, war, dass ich meine Tabelle für den (die) Gegenstand (en) queried und eine Liste der Primärschlüssel der Objekte, die ich gelöscht haben wollte, und die Löschfunktion nannte.