2017-11-21 2 views
0

Ich habe eine Produkttabelle in DynamoDB, die einige Elemente hat. Jetzt muss ich eine Liste von Käufern zu dem Produkt hinzufügen, das wachsen kann, d. H. An Liste anhängen. Es funktioniert, wenn ich eine leere Liste oder eine Liste mit einigen Elementen im Tabellenelement habe, aber für die erste Addition einen Fehler erzeugt. Gibt es eine Möglichkeit zu überprüfen, ob eine Liste existiert, dann anhängen, sonst eine Liste hinzufügen. hier ist mein Codean Liste anfügen, wenn vorhanden oder Liste in dynamoDB hinzufügen

let params = { 
    TableName: "product", 
    ExpressionAttributeNames: { 
     "#Y": "buyer" 
    }, 
    ExpressionAttributeValues: { 
     ":y": ["PersonXYZ"] 
    }, 
    Key: { 
     id: 'Hy2H4Z-lf' 
    }, 
    UpdateExpression: "SET #Y = list_append(#Y,:y)" 
}; 
updateItemInDDB(params).then((data) => { 
    res.status(200).send(data); 
}, err => { 
    console.log(err); 
    res.sendStatus(500); 
}); 

UpdateItemInDDB ist nur eine Funktion, die dnamodb Code auf ein params und führen Sie nimmt. Ich verwende JavaScript sdk für DynamoDB mit Document Client.

+0

Wie viele "Käufer" erwarten Sie für Ihre Produkte? DynamoDB-Elemente haben eine maximale Größe. Indem Sie Käufer als eine Eigenschaft eines Produkts hinzufügen, begrenzen Sie die Anzahl der Käufer, die Sie haben können. Architektonisch mag es besser sein, eine separate Tabelle für Käufer zu haben. –

+0

@MattHouser Es kann rund 100 Käufer bei max sein –

+0

@MattHouser Eine andere Tabelle für solch eine kleine Liste ist etwas, das ich gerne vermeiden würde, ich denke in meinem Fall, nur eine Liste ist ausreichend und effizienter. –

Antwort

1

EDIT: Nest der bedingte Ausdrücke

Sie SET append_list mit einem ConditionalExpression laufen könnten, dass das Attribut nicht vorhanden ist, dann, wenn das Gerät mit einem ConditinalExpression ausführen fehlschlägt, dass das Attribut nicht existiert.

let params1 = { 
    TableName: "product", 
    ExpressionAttributeNames: { 
     "#Y": "buyer" 
    }, 
    ExpressionAttributeValues: { 
     ":y": ["PersonXYZ"] 
    }, 
    Key: { 
     id: 'Hy2H4Z-lf' 
    }, 
    ConditionExpression: "attribute_exists(buyer)", 
    UpdateExpression: "SET #Y = list_append(#Y,:y)" 
}; 
updateItemInDDB(params1).then((data) => { 
    res.status(200).send(data); 
}, err => { 
    console.log(err); 
    let params2 = { 
    TableName: "product", 
    ExpressionAttributeNames: { 
     "#Y": "buyer" 
    }, 
    ExpressionAttributeValues: { 
     ":y": ["PersonXYZ"] 
    }, 
    Key: { 
     id: 'Hy2H4Z-lf' 
    }, 
    ConditionExpression: "attribute_not_exists(buyer)", 
    UpdateExpression: "SET #Y = (#Y,:y)" 
    }; 
    updateItemInDDB(params2).then((data) => { 
    res.status(200).send(data); 
    }, err => { 
     console.log(err); 
     res.sendStatus(500); 
    }); 
}); 
+0

Das hat geholfen. Nur ein Follow-up sollte nicht wir zweite Anfrage im Fehlerbereich der ersten Anfrage auslösen, denn wenn zuerst erfolgreich war, brauchen wir nicht die zweite Anfrage. ? –

+0

Ja, tut mir leid, ich wollte das erwähnen. Das wäre eine bessere Lösung. Ich war mir nicht sicher, was der erste zurückgeben würde, wenn das Attribut existiert, ist es ein Fehler? – Stu

+0

Ja, res.send wird in diesem Fall 2 Mal aufgerufen. das wird einen Fehler werfen. Bitte aktualisieren Sie Ihre Antwort entsprechend, damit ich die Frage annehmen und schließen kann. –

Verwandte Themen