2015-12-18 12 views
10

Próbuję przesłać zapytanie do tabeli DynamoDB, aby znaleźć wszystkie elementy, dla których nie ustawiono atrybutu email. Globalny indeks dodatkowy o nazwie EmailPasswordIndex istnieje w tabeli zawierającej pole email.Jak wyszukiwać nieistniejący atrybut (NULL) w DynamoDB

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)); 
}); 

Wynik: definicja

{ 
    "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 
} 

Tabela:

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)); 
}); 
+0

Czy możesz podać definicje atrybutów tabeli i indeksu? – mkobit

+0

@mkobit Dodano, dzięki. –

Odpowiedz

15

globalne indeksy wtórne DynamoDB pozwalają na indeksy być rzadki. Oznacza to, że jeśli masz GSI, którego hash lub klucz zakresu dla elementu nie jest zdefiniowany, to ten przedmiot nie będzie po prostu uwzględniony w GSI. Jest to przydatne w wielu przypadkach użycia, ponieważ umożliwia bezpośrednią identyfikację rekordów zawierających określone pola. Jednak takie podejście nie zadziała, jeśli szukasz braku pola.

Aby uzyskać wszystkie przedmioty, które nie mają ustawionego pola, najlepszy zakład może uciekać się do skanowania z filtrem. Ta operacja będzie bardzo drogie, ale to byłoby proste kod poszukuje coś jak poniżej:

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)); 
}); 
0

@jaredHatfield jest poprawna, jeśli pole nie istnieje, ale to nie będzie działać, jeśli złożony jest null. NULL jest słowem kluczowym i nie można go użyć bezpośrednio. Ale możesz go użyć z 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)); 
}) 
Powiązane problemy