2016-04-18 16 views
3

Meine Scan-Funktion:Scan-Funktion in DynamoDB mit reserviertem Schlüsselwort als Filterexpression NodeJS

var tableName = 'faasos_orders', 
    filterExp = 'status = :delivered OR status = :void OR status = :bad', 
    projectionValues = '', 
    expressionAttr = {};  
    expressionAttr[":delivered"] = "delivered"; 
    expressionAttr[":bad"] = "bad"; 
    expressionAttr[":void"] = "void"; 
    limit = 10; 
    dynamoConnector.getItemUsingScan(tableName, filterExp, projectionValues, expressionAttr, function (err, data) { ...........} 

Fehler beim Laufen:

{ [ValidationException: Invalid FilterExpression: Attribute name is a reserved keyword; reserved keyword: status] 
    message: 'Invalid FilterExpression: Attribute name is a reserved keyword; reserved keyword: status', 
    code: 'ValidationException', 
    time: Mon Apr 18 2016 21:57:30 GMT+0530 (IST), 
    requestId: 'AV6QFHM7SPQT1QR3D4OO81ED4FVV4KQNSO5AEMVJF66Q9ASUAAJG', 
    statusCode: 400, 
    retryable: false, 
    retryDelay: 0 } 

Jetzt mache ich den Punkt erhalte ich ein reserviertes Schlüsselwort zu verwenden, versuchen in th e filterExpression, die illegal ist. Aber wenn ich die gleiche Funktion durch aws laufen gui es Daten schön (für Details überprüfen Bild) liefert: Scan function on status through gui

Die Frage ist also, wie kann ich den Filterausdruck durch den Knoten hinzuzufügen, ohne den Schlüsselnamen ändern zu müssen ?? ?

Antwort

13

Gelöst:

Es gibt zwei von aws-sdk genommen Parameter:

Expression Name-Attribut

Expression Attribut Wert

beide bieten die Funktionalität zu ersetzen Platzhalter in der Attributliste verwendet . Hier durch Attribute ist es ein bisschen mehrdeutig, wo ich verwirrt wurde. Die Assistenten über aws bedeuten sowohl den Schlüssel als auch den Wert, wenn sie den Begriff Attribut verwenden.

Wenn Sie also ein reserviertes Schlüsselwort als Schlüsselattribut verwenden möchten, verwenden Sie den Parameter Name des Ausdrucksattributs mit # (Pfund), um den Platzhalter anzugeben.

In ähnlicher Weise, wo Sie Platzhalter für value-Attribute verwenden möchten, verwenden Sie den Parameter "Expression Attribute Value" mit: (Doppelpunkt), um den Platzhalter zu bezeichnen.

So schließlich sieht mein Code (in Betrieb) dies wie:

var param = { 
    TableName: "faasos_orders", 
    FilterExpression: "#order_status = :delivered OR #order_status = :void OR #order_status = :bad", 
    ExpressionAttributeValues: { 
    ":delivered": "delivered", 
    ":void": "void", 
    ":bad": "bad" 
    } 
    ExpressionAttributeNames: { 
    "#order_status": "status" 
    } 
}; 
    dynamodb.scan(param, function (err, data) {....}); 
+0

Vielen Dank für Ihre Mühe. Hatte einen ähnlichen Fehler. :-) – kometen

+0

Yay. Amazons Dokumentation ist einfach so großartig, weißt du. Obwohl dies das wichtigste Handbuch für DynamoDB gefunden wurde: [Dev Guide Neueste Amazon dynamodb] (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) @ kometen –

2

:status ist ein Platzhalter in Ihrem Ausdruck, für den Sie keinen Wert angeben. Sehen Sie, wie Sie Werte für die anderen Platzhalter hier bieten:

expressionAttr[":delivered"] = "delivered"; 
expressionAttr[":bad"] = "bad"; 
expressionAttr[":void"] = "void" 

Sie müssen das gleiche gilt für die :status Platzhalter tun. Ich sehe nichts über ein reserviertes Wort in der Fehlermeldung, daher bin ich mir nicht sicher, warum Sie glauben, dass das der Grund für den Fehler ist. Der Fehler besagt ganz speziell, dass Sie keinen Wert für den :status Platzhalter angeben.

+0

die Änderungen finden Sie auf. hatte mit dem Platzhalter gespielt, wie hier erklärt http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html#ExpressionAttributeNames Obwohl weder #status noch: status scheint zu arbeiten, {[ValidationException: ExpressionAttributeValues ​​enthält einen ungültigen Schlüssel: Syntax error; Schlüssel: "#status"] Und mit: status der Ausdruck läuft zwar reibungslos aber gibt keine Daten zurück –

+0

Sie müssen die Platzhalter-Syntax wie in Ihrem ursprünglichen Fragetext verwenden, aber Sie müssen auch den Wert für diesen Platzhalter angeben: 'expressionAttr [": status "] =" status "' –

+0

Das entspricht nicht der Bedingung mate. Es wird kein Wert zurückgegeben. Obwohl ich Werte in der db wie auf dem Bild gezeigt habe. Das aws-Dokument besagt, # für Namen von Ausdrucksattributen und: für Attributwerte von Ausdrücken zu verwenden. –

Verwandte Themen