node.js - nodejs - ¿Cómo se consulta un atributo(nulo) no existente en DynamoDB?
lambda dynamodb node js (2)
Estoy tratando de consultar una tabla de DynamoDB para encontrar todos los elementos donde el atributo de email
no está establecido. Un índice secundario global llamado EmailPasswordIndex
existe 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));
});
@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));
})
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, puede apostar por 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));
});