Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

361
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!