Получить значения из DynamoDB - PullRequest
1 голос
/ 22 октября 2019

Я хочу получить имя проекта из DynamoDB, который является одним из атрибутов моей таблицы.

Вот мой текущий код:

export async function main(event, context) {
  const data = JSON.parse(event.body);

  const params = {
    TableName: "dev-table",

    KeyConditionExpression: "userId = :userId" ,
    ConditionExpression: "projectId = :projectId",
    ExpressionAttributeValues: {
      ":userId": event.requestContext.identity.cognitoIdentityId,
      ":projectId": data.projectId
    }
  };

  try{
    const result = await dynamoDbLib.call("query", params);
    return success(result.Items);
  }catch(e){
    return failure(e);
  }
}

Но я получаю ошибку:

Значение, указанное в ExpressionAttributeValues, не используется в выражениях: keys: {: projectId}

Откуда возникает эта ошибка? Как я могу получить одно значение атрибута из моей таблицы?

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

ConditionExpression - допустимый параметр для методов deleteItem, putItem, transactWriteItems и updateItem. Для метода запроса используйте параметр FilterExpression для неключевых атрибутов:

export async function main(event, context) {
const data = JSON.parse(event.body);
const params = {
        TableName: "dev-table",
        KeyConditionExpression: "userId = :userId",
        FilterExpression: "projectId = :projectId",
        ExpressionAttributeValues: {
            ":userId": event.requestContext.identity.cognitoIdentityId,
            ":projectId": data.projectId
        }
    };

    try {
        const result = await dynamoDbLib.call("query", params);
        return success(result.Items);
    } catch(e) {
        return failure(e);
    }
}
0 голосов
/ 22 октября 2019

Проблема в том, что projectId начинается с project, то есть зарезервированное слово .

Согласно документ :

Если имя атрибута начинается с цифры или содержит пробел, специальный символ или зарезервированное слово, вы должны использовать имя атрибута выражения, чтобы заменить имя этого атрибута в выражении.

Итак, я бы попробовал это:

export async function main(event, context) {
  const data = JSON.parse(event.body);

  const params = {
    TableName: "dev-table",

    KeyConditionExpression: "userId = :userId" ,
    ConditionExpression: "#pId = :pId",
    ExpressionAttributeNames:{
        "#pId": "projectId"
    },
    ExpressionAttributeValues: {
      ":userId": event.requestContext.identity.cognitoIdentityId,
      ":pId": data.projectId
    }
  };

  try{
    const result = await dynamoDbLib.call("query", params);
    return success(result.Items);
  }catch(e){
    return failure(e);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...