web-dev-qa-db-fra.com

Fonction de scan dans DynamoDB avec le mot clé réservé comme FilterExpression NodeJS

Ma fonction de numérisation:

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) {  ...........} 

Erreur lors de l'exécution:

    { [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 }

Maintenant j'obtiens le point que j'essaye d'employer un mot-clé réservé dans le filterExpression qui est illégal. Mais si j'exécute la même fonction via aws gui, elle renvoie magnifiquement les données (vérifiez l'image pour plus de détails): fonction de numérisation sur l'état via gui

La question est donc de savoir comment ajouter l'expression de filtre via le nœud sans avoir à changer le nom de la clé ???

17
Saleem Ahmed

Résolu:

Aws-sdk prend deux paramètres:

Nom d'attribut d'expression

Valeur d'attribut d'expression

les deux offrent la fonctionnalité de remplacement des espaces réservés utilisés dans la liste des attributs. Ici, par attributs, c'est un peu ambigu, où je me suis trompé. Les assistants sur aws signifient à la fois la clé et la valeur lorsqu'ils utilisent le terme attribut.

Ainsi, dans le cas où vous souhaitez utiliser un mot clé réservé comme attribut clé, utilisez le paramètre Nom de l'attribut d'expression avec # (livre) pour désigner l'espace réservé.

De même, lorsque vous souhaitez utiliser des espaces réservés pour l'attribut value, utilisez le paramètre Expression Attribute Value avec: (deux-points) pour désigner l'espace réservé.

Donc finalement mon code (qui fonctionne) ressemble à ceci:

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) {....});
46
Saleem Ahmed

:status est un espace réservé dans votre expression pour lequel vous ne fournissez pas de valeur. Découvrez comment vous fournissez des valeurs pour vos autres espaces réservés ici:

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

Vous devez faire de même pour le :status espace réservé. Je ne vois rien sur un mot réservé dans le message d'erreur, donc je ne sais pas pourquoi vous pensez que c'est la cause de l'erreur. L'erreur indique très précisément que vous ne fournissez pas de valeur pour le :status espace réservé.

3
Mark B