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, }, })Creo que hay dos problemas en su código actual:
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.
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.
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. 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" }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