2016-11-11 2 views
0

Mein DynamoDB Schema ist:Paginierung in DynamoDB mit Global Sekundärindizes

TableName = 'Cities' 
PrimaryIndex = '_id' 
SecondaryIndex = 'areaId-timestamp-index' 
    - areaId is primary key 
    - timestamp is sort key 

Die Datenstruktur in DynamoDB sieht wie folgt aus:

{ _id: '....', name: 'New York', areaId: 22, timestamp: 1478882557071 }, 
{ _id: '....', name: 'Washington', areaId: 22, timestamp: 1478882557071 }, 
{ _id: '....', name: 'Copenhagen', areaId: 18, timestamp: 1478882557071 }, 
{ _id: '....', name: 'Berlin', areaId: 12, timestamp: 1478882557071 }, 

Ich möchte durch die Städte unter die Paginieren können, folgende Bedingungen:

  1. Nur Städte aus, fx, Bereich mit id 22
  2. Muss, um nach Zeitstempel paginierte werden

Meine Frage wie folgt aussieht:

const areaId = 22 

const params = { 
    TableName: 'Cities', 
    Limit: 10, 
    IndexName: 'areaId-timestamp-index', 
    KeyConditionExpression: 'areaId = :x', 
    ExpressionAttributeValues: { 
    ':x': areaId 
    } 
} 

dynamo.query(params) 

Als ich das laufen bekomme ich die erwartete Antwort mit einem lastEvaluatedKey

LastEvaluatedKey = { 
    areaId: 22, 
    _id: '8c43-d917-f9ec', // ID of last item in batch 
    timestamp: 1478882561962 // Timestamp of last item in batch 
} 

Als ich Führen Sie dann die nächste nachfolgende Abfrage aus (um mehr Ergebnisse zu erhalten), füge ich die ExclusiveStartKey-Eigenschaft mit den exakt gleichen Werten hinzu, die in LastEvaluatedKey zurückgegeben werden.

Allerdings, wenn ich die Abfrage ausführen, die ich erhalten:

The provided key element does not match the schema 

Antwort

0

Versuchen Sie, die LastEvaluatedKey zu ExclusiveStartKey bietet, haben Sie Sie in welchem ​​Format auch immer empfangen gesamten Wert zu liefern.

const areaId = 22 
const params = { 
    TableName: 'Cities', 
    Limit: 10, 
    LastEvaluatedKey:response.ExclusiveStartKey, // Get it from previous query respose and use in same format 
    IndexName: 'areaId-timestamp-index', 
    KeyConditionExpression: 'areaId = :x', 
    ExpressionAttributeValues: { 
    ':x': areaId 
    } 
} 

hoffe, das hilft, Dank