¿Cómo se consulta un atributo (nulo) no existente en DynamoDB?

Estoy tratando de consultar una tabla de DynamoDB para encontrar todos los elementos donde el atributo de email no está establecido. Existe un índice secundario global llamado EmailPasswordIndex en la tabla que incluye el campo de email .

 var params = { "TableName": "Accounts", "IndexName": "EmailPasswordIndex", "KeyConditionExpression": "email = NULL", }; dynamodb.query(params, function(err, data) { if (err) console.log(JSON.stringify(err, null, 2)); else console.log(JSON.stringify(data, null, 2)); }); 

Resultado:

 { "message": "Invalid KeyConditionExpression: Attribute name is a reserved keyword; reserved keyword: NULL", "code": "ValidationException", "time": "2015-12-18T05:33:00.356Z", "statusCode": 400, "retryable": false } 

Definición de la tabla:

 var params = { "TableName": "Accounts", "KeySchema": [ { "AttributeName": "id", KeyType: "HASH" }, // Randomly generated UUID ], "AttributeDefinitions": [ { "AttributeName": "id", AttributeType: "S" }, { "AttributeName": "email", AttributeType: "S" }, // User e-mail. { "AttributeName": "password", AttributeType: "S" }, // Hashed password. ], "GlobalSecondaryIndexes": [ { "IndexName": "EmailPasswordIndex", "ProvisionedThroughput": { "ReadCapacityUnits": 1, "WriteCapacityUnits": 1 }, "KeySchema": [ { "AttributeName": "email", KeyType: "HASH" }, { "AttributeName": "password", KeyType: "RANGE" }, ], "Projection": { "ProjectionType": "ALL" } }, ], ProvisionedThroughput: { ReadCapacityUnits: 1, WriteCapacityUnits: 1 } }; dynamodb.createTable(params, function(err, data) { if (err) console.log(JSON.stringify(err, null, 2)); else console.log(JSON.stringify(data, null, 2)); }); 

Los índices secundarios globales de DynamoDB permiten que los índices sean dispersos. Eso significa que si tiene un GSI cuyo hash o clave de rango para un elemento no está definido, ese elemento simplemente no se incluirá en el GSI. Esto es útil en varios casos de uso, ya que le permite identificar directamente los registros que contienen ciertos campos. Sin embargo, este enfoque no funcionará si está buscando la falta de un campo.

Para obtener todos los elementos que tienen un campo que no está configurado, su mejor apuesta puede ser recurrir a un escaneo con un filtro. Esta operación será muy costosa, pero sería un código sencillo con el siguiente aspecto:

 var params = { TableName: "Accounts", FilterExpression: "attribute_not_exists(email)" }; dynamodb.scan(params, { if (err) console.log(JSON.stringify(err, null, 2)); else console.log(JSON.stringify(data, null, 2)); }); 

@jaredHatfield es correcto si el campo no existe pero no funcionará si el archivo es nulo. NULL es una palabra clave y no se puede usar directamente. Pero puedes usarlo con ExpressionAttributeValues.

 const params = { TableName: "Accounts", FilterExpression: "attribute_not_exists(email) or email = :null", ExpressionAttributeValues: { ':null': null } } dynamodb.scan(params, (err, data) => { if (err) console.log(JSON.stringify(err, null, 2)); else console.log(JSON.stringify(data, null, 2)); })