2016-06-15 6 views
0

Ich habe die folgende Tabelle Erstellungscode für DynamoDB (C#):DynamoDB Abfrage Verwirrung

client.CreateTable(new CreateTableRequest 
{ 
    TableName = tableName, 
    ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 20, WriteCapacityUnits = 10 }, 
    KeySchema = new List<KeySchemaElement> 
     { 
      new KeySchemaElement 
      { 
       AttributeName = "RID", 
       KeyType = KeyType.HASH 
      } 
     } 
    , 
    AttributeDefinitions = new List<AttributeDefinition> 
     { 
      new AttributeDefinition { 
       AttributeName = "RID", 
       AttributeType = ScalarAttributeType.N 
      } 
     } 
}); 

die Daten, die von diesem JSON in dieser Tabelle aufgefüllt wird kommt:

[ 
{"RID": 208649, "CLI_RID": 935476, "PRT_DT": "VAL_AA", "DISTR": "INTERNAL"}, 
{"RID": 217427, "CLI_RID": 1009561, "PRT_DT": "VAL_BB", "DISTR": "INTERNAL", "STATE": "VAL_BD"}, 
{"RID": 223331, "CLI_RID": 1325477, "PRT_DT": "VAL_CB", "DISTR": "", "STATE": "VAL_CD", "FNAME": "VAL_CE", "START": "VAL_CF"}, 
{"RID": 227717, "CLI_RID": 1023478, "PRT_DT": "VAL_DB", "DISTR": "", "STATE": "VAL_DD"} 
{"RID": 217462, "CLI_RID": 1009561, "PRT_DT": "VAL_BB", "DISTR": "", "STATE": "VAL_BD"}, 
{"RID": 218679, "CLI_RID": 1009561, "PRT_DT": "VAL_AA", "DISTR": "INTERNAL"}, 
{"RID": 222376, "CLI_RID": 1263978, "PRT_DT": "VAL_DB", "DISTR": "", "STATE": "VAL_DD"} 
] 

Wie würde ich Abfrage oder Filter für alle Datensätze mit 1009561 in Spalte "CLI_RID" und Spalte "DISTR" <> "INTERN"?

In dieser DynamoDB-Tabelle befinden sich ca. 15 Mil Datensätze.

Ist meine Tabelle für diese Abfrage/diesen Filter korrekt definiert?

Aktualisiert Tabellenerstellung:

// CLI_RIDIndex 
var cli_ridIndex = new GlobalSecondaryIndex 
{ 
    IndexName = "cli_ridIndex", 
    ProvisionedThroughput = new ProvisionedThroughput 
    { 
     ReadCapacityUnits = 20, 
     WriteCapacityUnits = 10 
    }, 
    KeySchema = { 
     new KeySchemaElement 
     { 
      AttributeName = "CLI_RID", KeyType = "HASH" 
     } 
    }, 
    Projection = new Projection { ProjectionType = "ALL" } 
}; 


client.CreateTable(new CreateTableRequest 
{ 
    TableName = tableName, 
    ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 20, WriteCapacityUnits = 10 }, 
    KeySchema = new List<KeySchemaElement> 
     { 
      new KeySchemaElement 
      { 
       AttributeName = "RID", 
       KeyType = KeyType.HASH // Partiton Key (Unique) 
      }, 
      new KeySchemaElement 
      { 
       AttributeName = "CLI_RID", 
       KeyType = KeyType.RANGE // Sort Key 
      } 
     } 
    , 
    AttributeDefinitions = new List<AttributeDefinition> 
     { 
      new AttributeDefinition { 
       AttributeName = "RID", 
       AttributeType = ScalarAttributeType.N 
      }, 
      new AttributeDefinition { 
       AttributeName = "CLI_RID", 
       AttributeType = ScalarAttributeType.N 
      } 
     }, 
    GlobalSecondaryIndexes = { cli_ridIndex } 
}); 

Aber wenn man versucht, sie zu fragen,

var request = new QueryRequest 
{ 
    TableName = "TNAArchive", 
    KeyConditionExpression = "CLI_RID = :v_cli_rid", 
    ExpressionAttributeValues = new Dictionary<string, AttributeValue> { 
     {":v_cli_rid", new AttributeValue { S = "905466" }}} 
}; 

var response = client.Query(request); 

ich diesen Fehler:

Query condition missed key schema element: RID 

Ich glaube, ich bin nicht wirklich zu verstehen, wie man das macht.

Antwort

0

Nach Ihrer Tabellenstruktur, werden Sie nicht in der Lage sein Abfrage auf den Tisch zu führen, aber Sie müssen Scan es, die wir vermeiden müssen.

Abfrage ausführen zu können Sie bestimmte Dinge

1) Hinzufügen eines globalen Sekundär Index (GSI) mit dem Feld CLI_RID als Hash

2) Now You Abfrage GSI durch CLI_RID vorbei und fügen Sie ändern müssen Abfrage Filter mit Bedingung <> Ihr Wert

Hier ist die Referenz link.

Bearbeiten: Ihre Haupttabelle Struktur wird gleich sein, keine Notwendigkeit zu ändern, aber Sie müssen eine weitere GSI mit Hash-Taste als CLI_RID und Projekt erforderlichen Tabelle Attribut hinzufügen.

Jetzt müssen Sie Ihr GSI anstelle der Tabelle mit einem Hash-Schlüssel wie CLI_RID abfragen, Sie müssen RID hier nicht übergeben. here is the link on how to add GSI on table.

Wenn CLI_RID nicht in einer Master-Tabelle vorhanden ist, wird dieser Datensatz nicht in der GSI reflektiert, so dass Sie sich keine Sorgen machen müssen.

Bearbeiten 2: Fügen Sie einfach (IndexName = NameOFYourIndex) Attribut während der Abfrage und alles sollte funktionieren.

var request = new QueryRequest 
{ 
    TableName = "TNAArchive", 
    IndexName = "NameOfYourIndex", 
    KeyConditionExpression = "CLI_RID = :v_cli_rid", 
    ExpressionAttributeValues = new Dictionary<string, AttributeValue> { 
     {":v_cli_rid", new AttributeValue { S = "905466" }}} 
}; 

Hoffnung, die ich habe auch einen RID-Wert in der Abfrage enthalten hilft

+0

Will? Können Sie mir die zu verwendende Struktur zeigen? Einige Datensätze haben möglicherweise keinen CLI_RID-Wert. – MB34

+0

@ MB34 Ich habe die Antwort aktualisiert. –

+0

In dem Beispiel zu dem von Ihnen angegebenen Link sehe ich nicht, wo die Erstellung des sekundären Index definiert hat, in welcher Spalte sich der Index befand. – MB34