Búsqueda de sitios web

typescript - error de KeyConditionExpression en consulta de tabla DynamoDB


¿Cómo arreglo el error siguiente y por qué aparece "tipo de operando: M"? He leído la documentación de AWS y buscado en Stack Overflow, pero aún no pude resolver este problema después de unas pocas horas. Quiero consultar un ítem que esté activo y tenga una fecha de venta (dateSold) entre la fecha de inicio y de fin en formato ISO. Estoy interpretando el error "tipo de operando: M" como que estoy usando el tipo mapa en mis operandos: dateSold, :start y :end. Sin embargo, todos los operandos son solo cadenas.

El comando SQL habría sido algo como: SELECT dateSold, profit FROM Items WHERE isActive='true' AND dateSold > start AND dateSold < end

Error: "message":"Expresión KeyConditionExpression no válida: Tipo de operando incorrecto para el operador o función; operador o función: BETWEEN, tipo de operando: M","code":"ValidationException"

Código :

AWS.config.update({ region: "us-east-2" });
    const documentClient = AWS.DynamoDB.DocumentClient({ apiVersion: "2012-08-10" });

    const options = {
        TableName: "Items",
        ProjectionExpression: "dateSold, profit",
        IndexName: "isActive-dateSold-index",
        KeyConditionExpression:
          "isActive = :isActive AND dateSold BETWEEN :start AND :end",
        ExpressionAttributeValues: {
          ":start": { S: start.toISOString() },
          ":end": { S: end.toISOString() },
          ":isActive": { S: "true" },
        },
      }

    const result = await documentClient
      .query(options)
      .promise()

Esquema :

Table: {
    AttributeDefinitions: [
    { AttributeName: "dateSold", AttributeType: "S" },
    { AttributeName: "id", AttributeType: "S" },
    { AttributeName: "isActive", AttributeType: "S" },
    ],
    TableName: "Items",
    KeySchema: [{ AttributeName: "id", KeyType: "HASH" }],
    GlobalSecondaryIndexes: [
    {
        IndexName: "isActive-dateSold-index",
        KeySchema: [
        { AttributeName: "isActive", KeyType: "HASH" },
        { AttributeName: "dateSold", KeyType: "RANGE" },
        ],
    },
    ],
},

Respuesta #1

Tienes:

ExpressionAttributeValues: {
          ":start": { S: start.toISOString() },
          ":end": { S: end.toISOString() },
          ":isActive": { S: "true" },
        },

Algunos SDK de DynamoDB hacen la codificación de tipos automáticamente. No necesitas escribir { S: start.toISOString() }, puede ser suficiente con simplemente escribir start.toIsoString(), sin ponerlo en un mapa. No sé si el SDK que estás usando es uno de esos. El de Python (boto3) lo hace, por ejemplo.

Por cierto, ¿cómo es que S en lugar de "S" (una cadena entre comillas) en tu código siquiera funciona?