2015-12-18 20 views
10

'da olmayan (null) özniteliği için nasıl sorgu yaparsınız email özniteliğinin ayarlanmadığı tüm öğeleri bulmak için DynamoDB tablosunu sorgulamaya çalışıyorum.alanını içeren tablo üzerinde EmailPasswordIndex adlı global bir ikincil dizin bulunmaktadır.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)); 
}); 

Sonuç:

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

Tablo tanım: endeksler seyrek olması için

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

Tablo ve dizin özellik tanımlarınızı sağlayabilir misiniz? – mkobit

+0

@mkobit Eklendi, teşekkürler. –

cevap

15

DynamoDB Global İkincil Endeksleri izin verir. Yani, bir öğe için hash veya aralık anahtarı tanımlanmamış bir GSI'nız varsa, bu öğe GSI'ye dahil edilmeyecektir. Bu, belirli alanları içeren kayıtları doğrudan tanımlamanıza izin verdiği için bir dizi kullanım durumunda yararlıdır. Ancak, bir alan eksikliğini arıyorsanız, bu yaklaşım işe yaramaz.

Alanı olmayan tüm öğeleri almak için en iyi seçeneğiniz belirlenmemişse, bir filtreli taramaya başvurmak gerekebilir. Bu işlem çok pahalı olacak ama şu gibi basit kod görünümlü bir şey olurdu: alanına yok ama dosyalanmış, null ise işe yaramaz eğer

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 doğrudur. NULL bir anahtar kelimedir ve doğrudan kullanamaz. Ama bunu ExpressionAttributeValues ​​ile kullanabilirsiniz.

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)); 
}) 
İlgili konular