2015-12-18 15 views
10

में एक गैर-मौजूद (शून्य) विशेषता के लिए आप कैसे क्वेरी करते हैं I email विशेषता सेट नहीं है, जहां सभी आइटम खोजने के लिए एक डायनेमोडीबी तालिका से पूछताछ करने का प्रयास कर रहा हूं। EmailPasswordIndex नामक एक वैश्विक माध्यमिक सूचकांक तालिका पर मौजूद है जिसमें email फ़ील्ड शामिल है।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)); 
}); 

परिणाम:

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

क्या आप अपनी तालिका और अनुक्रमणिका विशेषता परिभाषाएं प्रदान कर सकते हैं? – mkobit

+0

@mkobit जोड़ा गया, धन्यवाद। –

उत्तर

15

DynamoDB के ग्लोबल माध्यमिक इंडेक्स अनुक्रमित विरल होने के लिए अनुमति देते हैं। इसका मतलब है कि यदि आपके पास एक जीएसआई है जिसका किसी आइटम के लिए हैश या रेंज कुंजी परिभाषित नहीं किया गया है तो उस आइटम को जीएसआई में शामिल नहीं किया जाएगा। यह कई उपयोग मामलों में उपयोगी है क्योंकि यह आपको कुछ फ़ील्ड वाले रिकॉर्ड की पहचान करने की अनुमति देता है। हालांकि, यदि आप किसी क्षेत्र की कमी की तलाश में हैं तो यह दृष्टिकोण काम नहीं करेगा।

उन सभी आइटमों को प्राप्त करने के लिए जिनके पास कोई फ़ील्ड नहीं है, वे फ़िल्टर के साथ स्कैन का उपयोग कर रहे हैं। यह कार्रवाई बहुत महंगा हो जाएगा, लेकिन वह ऐसा सीधा कोड देख कुछ होगा:

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 यदि क्षेत्र मौजूद नहीं है लेकिन अगर दायर रिक्त है कि काम नहीं करेगा सही है। नल एक कीवर्ड है और सीधे उपयोग नहीं किया जा सकता है। लेकिन आप इसे 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)); 
}) 
संबंधित मुद्दे