如何在DynamoDB中查询不存在的(null)属性

我正在尝试查询DynamoDB表以查找email未设置属性的所有项目。EmailPasswordIndex包含该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));

});

结果:

{

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

});

以上是 如何在DynamoDB中查询不存在的(null)属性 的全部内容, 来源链接: utcz.com/qa/408196.html

回到顶部