Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

366
Visualizações
AWS, inicio de dynamodb con condición gsi

Necesito ejecutar una consulta como esta: seleccione * de la tabla donde sample_date como "2020-05-%"

Para hacer esto, estoy llamando a

 db.query({ TableName: "Tubes", Select: "ALL_ATTRIBUTES", IndexName: "sampling_date_idx", KeyConditionExpression: " sampling_date > :sampling_date ", ExpressionAttributeValues:{ ':sampling_date': {'S': '2020-05-'}} }, function(error: AWSError, data: QueryOutput){ console.log(error, data); })

Y me sale este mensaje de error:

 {"errorType":"Error","errorMessage":"{\"message\":\"Query key condition not supported\",\"code\":\"ValidationException\",

Mi mesa:

 this.tubes = new dynamodb.Table(this, "tubes", { tableName: "Tubes", billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, partitionKey: { name: "id", type: dynamodb.AttributeType.STRING }, pointInTimeRecovery: true, removalPolicy: cdk.RemovalPolicy.RETAIN }); this.tubes.addGlobalSecondaryIndex({ indexName: "sampling_date_idx", sortKey: { name: 'sampling_date_srt', type: AttributeType.STRING }, partitionKey: { name: "sampling_date", type: AttributeType.STRING, }, })
over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Creo que hay dos problemas en su código actual:

  1. En KeyConditionExpression, debe haber una condición de igualdad en un solo valor de clave de partición. En su caso, debe incluir "sampling_date = :sampling_date".

Lea la sección "KeyConditionExpression" en https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

En resumen, solo puede realizar una prueba de igualdad contra la clave de partición.

  1. No estoy seguro de qué idioma usas. Sospecho que su sintaxis para ExpressionAttributeValues no es correcta.

La sintaxis dada en el documento de AWS es:

 "ExpressionAttributeValues": { "string" : { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } }

En tu caso, puede ser algo como:

 "ExpressionAttributeValues": { ":sampling_date": {"S": "2020-05-01"} }

Mi experiencia es en C#, puede ser algo como:

 ExpressionAttributeValues = new Dictionary<string, AttributeValue>() { { ":sampling_date", new AttributeValue{S = "2005-05-01"} } }

Para resolver su problema, es posible que deba usar otro atributo como clave de partición del índice. muestreo_fecha solo se puede utilizar como clave de ordenación.

over 4 years ago · Santiago Trujillo Relatório

0

sampling_date es la clave de partición para su GSI sampling_date_idx .

La documentación de DynamoDB dice que en las expresiones de condición clave:

 You must specify the partition key name and value as an equality condition.

Fuente: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.KeyConditionExpressions

Por lo tanto, sampling_date solo se puede usar con el operador de comparación "igual a". Ninguno de los otros operadores como menor que, mayor que, entre, contiene, comienza con, etc. se puede usar con la fecha de sampling_date .

Sin embargo, ¡estos operadores se pueden usar con una clave de ordenación!

Entonces, si puede rediseñar su tabla y/o índices de manera que sampling_date se convierta en una clave de ordenación de algún índice, puede usar begins_with en él.

Aquí hay una sugerencia:

Cree un GSI con clave de partición = sampling_year y clave de clasificación = sampling_date .

Entonces, si su mesa tiene los siguientes elementos:

 { "id": "id1", "sampling_year": 2020, "sampling_date": "2020-04-01" }
 { "id": "id2", "sampling_year": 2020, "sampling_date": "2020-05-01" }
 { "id": "id3", "sampling_year": 2020, "sampling_date": "2020-06-01" }

Y usas el siguiente código de Node.js:

 let AWS = require("aws-sdk") let dc = new AWS.DynamoDB.DocumentClient() dc.query({ TableName: "Tubes", IndexName: "sampling_year-sampling_date-index", KeyConditions: { "sampling_year": { ComparisonOperator: "EQ", AttributeValueList: [2020] }, "sampling_date": { ComparisonOperator: "BEGINS_WITH", AttributeValueList: ["2020-05-"] } } }

Obtendrá el resultado deseado:

 { "id": "id2", "sampling_year": 2020, "sampling_date": "2020-05-01" }
over 4 years ago · Santiago Trujillo Relatório

0

Tratar

 KeyConditionExpression: `begins_with(sampling_date, :sampling_date)`

Consulte las expresiones de condición disponibles aquí... https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda