我正在尝试查询DynamoDB表以查找email未设置属性的所有项目。EmailPasswordIndex包含该email字段的表上存在一个称为的全局二级索引。
email
EmailPasswordIndex
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)); });
结果:
{ "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 }
表定义:
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)); });
DynamoDB的全局二级索引允许稀疏索引。这意味着,如果您有一个GSI,但未定义该项目的哈希或范围键,则该项目将不会直接包含在GSI中。这在许多用例中很有用,因为它使您可以直接识别包含某些字段的记录。但是,如果您缺少字段,则此方法将行不通。
要获取所有未设置字段的项目,最好的选择是使用过滤器进行扫描。该操作将非常昂贵,但将是如下所示的简单代码:
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)); });