2

Mein Dokument einen JSON-Array Aktualisierung wie folgt aussieht:in AWS DynamoDB

{ 
    "data": { 
     "eventId": "20161029125458-df-d", 
     "name": "first", 
     "purpose": "test", 
     "location": "yokohama", 
     "dateArray": [], 
     "attendees": [ 
     { 
      "attendeeId": "2016102973634-df", 
      "attendeeName": "lakshman", 
      "personalizedDateSelection": {} 
     }, 
     { 
      "attendeeId": "2016102973634-tyyu", 
      "attendeeName": "diwaakar", 
      "personalizedDateSelection": {} 
     } 
     ] 
    } 
} 

Sag mal, ich brauche die Teilnehmer JSON-Array mit attendeeId zu aktualisieren: 2016102973634-df. Ich habe viele Möglichkeiten versucht mit Update und Bedingung Ausdruck, aber keinen Erfolg.

Hier ist mein Versuch:

const params = { 
    TableName: "event", 
    Key: { 
    "eventId": eventId 
    }, 
    UpdateExpression: "SET attendees[???] = ", 
    ConditionExpression: attendees.attendeeId = "2016102973634-df", 
    ExpressionAttributeValues: { 
    ":attendee" : attendeeList 
    }, 
    ReturnValues: "ALL_NEW" 
}; 


dynamo.update(params, (err, data) => { 
    if (err) { 
    return reject(err); 
    } 
    console.log(data.Attributes); 
}); 

konnte nicht alle Ressourcen finden für eine Json in einem Array zu aktualisieren.

Nach dem @ notionquest's Kommentar: - Habe keinen JsonMarshaller benutzt. Am Anfang habe ich das leere Array an die Teilnehmer Feld wie folgt aus:

{ 
    "eventId": "20161029125458-df-d", 
    "name": "first", 
    "purpose": "test", 
    "location": "yokohama", 
    "dateArray": [], 
    "attendees": [] 
} 

und dann Wenn ein neuer Teilnehmer kommt ich es den Teilnehmer Eigenschaft wie folgt hinzu:

const attendee = { 
    "attendeeName": "user1", 
    "personalizedDateSelection": {"today": "free"} 
} 
const attendeeList = [attendee]; 
const eventId = "20161029125458-df-d"; 


const params = { 
    TableName: "event", 
    Key: { 
    "eventId": eventId 
    }, 
    UpdateExpression: "SET attendees = list_append(attendees, :attendee)", 
    ExpressionAttributeValues: { 
    ":attendee" : attendeeList 
    }, 
    ReturnValues: "ALL_NEW" 
}; 


dynamo.update(params, (err, data) => { 
    if (err) { 
    return reject(err); 
    } 
    console.log("in update dynamo"); 
    console.log(data.Attributes); 
}); 

Wie Sie haben in den obigen Schnipsel gesehen, füge ich zunächst leer [] Array hinzu und füge einen neuen Teilnehmer mit dem obigen Code hinzu. Nun, wie aktualisiere ich einen bestimmten JSON in einem Array. Wenn Sie sagen, dass das nicht möglich ist, was kann ich sonst noch versuchen?

Soll ich versuchen, diese:

  1. die Voll JSON Get.
  2. Manipulieren Sie die JSOn und ändern Sie die Dinge, die ich in meinem NodeJS will.
  3. Und dann aktualisieren Sie den neuen JSON DynamoDB.
  4. Aber dies verbraucht zwei Aufrufe an dynamoDB, die ineffizient scheinen.

Möchten Sie wissen, ob es einen runden Weg gibt?

+0

Haben Sie die Daten als JSON in DynamoDB mit JsonMarshaller gespeichert? Wenn ja, hat die API keine Option zum Aktualisieren der JSON-Daten. – notionquest

+0

@notionquest Ich habe meine Frage aktualisiert, wie ich Json in das Array eingefügt habe.Möchte deine Gedanken wissen !!! –

Antwort

0

Ich konnte keine Antwort finden, um das JSON-Array abzufragen und zu aktualisieren. Ich denke, dass dies ein profitables AWS-Motiv sein könnte, um diese Funktionen nicht zuzulassen. Wenn Sie eine andere ID als den Primärschlüssel abfragen müssen, müssen Sie einen sekundären Index erstellen, der kostengünstig ist. Diese sekundären Indexkosten sind zusätzlich zu den dyn amoDB-Tabellenkosten.

Da ich nicht extra Geld auf Sekundärindex zahlen möchten, änderte ich meine DynamoDB Schema auf die folgenden:

{ 
    "data": { 
     "eventId": "20161029125458-df-d", 
     "name": "first", 
     "purpose": "test", 
     "location": "yokohama", 
     "dateArray": [], 
     "attendees": { 
     "2016102973634-df": { 
      "attendeeId": "2016102973634-df", 
      "attendeeName": "lakshman", 
      "personalizedDateSelection": {} 
     }, 
     "2016102973777-df": { 
      "attendeeId": "2016102973777-df", 
      "attendeeName": "ffff", 
      "personalizedDateSelection": {} 
     } 
     } 
    } 
} 

Ändern Teilnehmer aus [] zu {}. Dies erlaubt mir die Flexibilität, bestimmte attendeeId abzufragen und den gesamten damit verbundenen JSON zu ändern. Obwohl dies ein überflüssiger Schritt ist, möchte ich kein zusätzliches Geld für mein Hobbyprojekt ausgeben.

+1

Könnten Sie bitte die Beispielabfrage posten, um nested json zu aktualisieren? Wie aktualisiert man "Teilnehmer2016102973634-df" json? und Wie update "Teilnehmer2016102973634-df.atttendeeName"? – manojpt