2017-10-03 5 views
0

J'ai essayé de demander des données à partir du DynamoDB pendant 2 jours maintenant. Me rendre fou.Impossible d'interroger DynamoDB avec Begins_with pour la liste d'éléments

J'ai une table pour les bureaux dans un bureau. Dites qu'il y a deux bureaux, Cork et Dublin. J'ai une colonne appelée 'deskName' qui aurait des noms comme 'cork1', 'cork2', 'dub1', 'dub2'. Je veux être en mesure d'interroger la table pour les éléments qui contiennent «cork» ou «dub» car ils sont dans la même table, mais je ne veux pas revenir en arrière toute la table.

Table details

Table Columns

CODE:

const params = { 
    TableName: process.env.DYNAMODB_DESKS_TABLE, 
    //KeyConditionExpression: '#deskName = :deskName', 
    KeyConditionExpression: "begins_with(#deskName, :deskName)", 
    ExpressionAttributeNames: { 
     "#deskName": "deskName" 
    }, 
    ExpressionAttributeValues: { 
     ":deskName": "cork" 
    } 
    } 

    dynamodb.query(params, (error, result) => { 
    if (error) { 
     console.error(error); 
     callback(null, { 
     statusCode: error.statusCode || 501, 
     headers: {'Content-Type': 'text/plain'}, 
     body: 'Couldn\'t get desks' 
     }); 
     return; 
    } 

    const response = { 
     statusCode: 200, 
     body: JSON.stringify(result.Item) 
    }; 

    callback(null, response); 

    }); 

YAML:

HotDeskDesksDBTable: 
    Type: 'AWS::DynamoDB::Table' 
    DeletionPolicy: Retain 
    Properties: 
    AttributeDefinitions: 
     - 
     AttributeName: deskName 
     AttributeType: S 
    KeySchema: 
     - 
     AttributeName: deskName 
     KeyType: HASH 
    ProvisionedThroughput: 
     ReadCapacityUnits: 1 
     WriteCapacityUnits: 1 
    TableName: ${self:provider.environment.DYNAMODB_DESKS_TABLE} 

ERROR:

ValidationException: Query key condition not supported 

J'ai réussi à obtenir un article qui revenait quand j'avais la condition = 'cork-1'. Je veux obtenir tous les articles qui commencent par «liège».

Merci

+0

Quelle est l'erreur ou le problème exacty? –

+0

Totalement oublié d'ajouter cela. Désolé, je vais l'ajouter à la question maintenant. – SmiffyKmc

+0

@MarkB a ajouté l'erreur là maintenant, merci pour cela! – SmiffyKmc

Répondre

0

Vous obtenez ce ...

Syntax error in module 'api/desks/get': SyntaxError 
    KeyConditionExpression: "#deskName = :deskName", 
    ^^^^^^^^^^^^^^^^^^^^^^ 
SyntaxError: Unexpected identifier 

à cause de cela ...

const params = { 
    TableName: process.env.DYNAMODB_DESKS_TABLE, 
    IndexName: 'deskName' 
    KeyConditionExpression: "#deskName = :deskName", 
    ExpressionAttributeNames:{ 
    "#deskName": "deskName" 
    }, 
    ExpressionAttributeValues: { 
    ":deskName": "cork" 
    } 
} 

JavaScript objets nécessitent une virgule après chaque propriété. Il vous manque un après IndexName: 'deskName'.

Je recommande l'utilisation de DocumentClient car il mappe facilement les types de données Javascript aux types de données DynamoDB.

0

Voici ce que je comprends:

  1. Il vous manque une virgule à la fin de votre ligne de IndexName:

const params = {

TableName: process.env.DYNAMODB_DESKS_TABLE, 

IndexName: 'deskName', 
  1. Pour ExpressionAttributeValues , vous devez définir le type de données, par exemple:
ExpressionAttributeValues: { 
    ":deskName": { "S": "cork" } 
} 
+0

J'ai essayé d'ajouter ça mais ça n'a pas fonctionné malheureusement :( – SmiffyKmc