2015-12-18 14 views
10

Tôi đang cố truy vấn bảng DynamoDB để tìm tất cả các mục mà thuộc tính email không được đặt. Chỉ mục phụ toàn cầu có tên là EmailPasswordIndex tồn tại trên bảng bao gồm trường email.Làm cách nào để bạn truy vấn thuộc tính không tồn tại (null) trong 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)); 
}); 

Kết quả:

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

Bảng định nghĩa:

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

Bạn có thể cung cấp định nghĩa thuộc tính bảng và chỉ mục của mình không? – mkobit

+0

@mkobit Đã thêm, cảm ơn. –

Trả lời

15

Chỉ số Secondary toàn cầu DynamoDB của phép cho các chỉ số được thưa thớt. Điều đó có nghĩa là nếu bạn có một GSI có khóa băm hoặc dãy cho một mục không được xác định thì mục đó sẽ không được bao gồm trong GSI. Điều này rất hữu ích trong một số trường hợp sử dụng vì nó cho phép bạn trực tiếp xác định các bản ghi có chứa các trường nhất định. Tuy nhiên, cách tiếp cận này sẽ không hoạt động nếu bạn đang tìm kiếm sự thiếu trường.

Để nhận tất cả các mục có trường không được đặt, đặt cược tốt nhất của bạn có thể được sử dụng để quét bằng bộ lọc. Hoạt động này sẽ rất tốn kém nhưng nó sẽ là mã đơn giản trông giống như sau:

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 là đúng nếu trường không tồn tại nhưng sẽ không hoạt động nếu trường đó không có giá trị. NULL là một từ khóa và không thể sử dụng trực tiếp. Nhưng bạn có thể sử dụng nó với 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)); 
}) 
Các vấn đề liên quan