Başlangıç4 dakikalık okuma

DynamoDB'de Sayfalama

DynamoDB, tek bir çağrıda "tüm" sonuçları asla döndürmez. Bir Query veya Scan en fazla 1 MB veri döndürür, sonra size devam etmek için bir LastEvaluatedKey verir. Sayfalamayı doğru yapmak, bir sayaç üzerinde değil, o anahtar üzerinde döngü kurmak demektir.

DynamoDB'de sayfalama nasıl çalışır?

Bir Query veya Scan, çağrı başına en fazla 1 MB döndürür, sonra bir LastEvaluatedKey geri verir. Sayfalamak için o anahtarı bir sonraki çağrının ExclusiveStartKey'i olarak geçirir ve DynamoDB hiçbir anahtar döndürmeyene kadar döngü kurarsınız. Sayfa numarası, toplam sayı yoktur ve Limit, döndürülen değil, değerlendirilen item'ları sınırlar.

let key;
do {
  const out = await client.send(new QueryCommand({...params, ExclusiveStartKey: key}));
  process(out.Items);
  key = out.LastEvaluatedKey;
} while (key);

LastEvaluatedKey undefined olduğunda, sona ulaşmışsınızdır. Bir sonraki dilimi getirmek için onu ExclusiveStartKey olarak geri geçirin.

Kontrol akışı, yalnızca yokluk anahtarında çıkan tek bir döngüdür:

varyokQuery / ScanItem'ları İşleLastEvaluatedKey?ExclusiveStartKey ayarlaBitti

Her geçiş, ya döndürülen anahtardan devam eder ya da durur — sayaç yoktur.

Limit bir sayfa boyutu değildir

Limit, DynamoDB'nin bir FilterExpression'dan sonra kaç item döndürdüğünü değil, kaç item değerlendirdiğini sınırlar. Bir filtre ardındaki bir Limit: 25 sorgusu 3 item döndürebilir ve yine de size bir LastEvaluatedKey verebilir — bir sayfa kısa görünse bile, anahtar boşalana kadar sayfalamaya devam etmelisiniz. Boş olmayan bir LastEvaluatedKey da asla daha fazla eşleşen item vaat etmez; yalnızca yok olan bir anahtar, sona ulaştığınızı kanıtlar.

SDK'nın sayfalamasına izin verin

Her iki SDK da yukarıdaki döngüyü sarar, böylece sayfalarda doğrudan yineleme yapabilirsiniz:

// AWS SDK for JavaScript v3
import {paginateQuery} from '@aws-sdk/lib-dynamodb';
for await (const page of paginateQuery({client}, params)) {
  process(page.Items);
}
# boto3
paginator = client.get_paginator('query')
for page in paginator.paginate(**params):
    process(page['Items'])

Sayfa numaraları yok

DynamoDB'nin toplam sayısı ve rastgele sayfa erişimi yoktur — imleçleri yeniden oynatmadan "sayfa 7"ye atlayamaz veya geriye sayfalayamazsınız. Kullanıcı arayüzlerini numaralı sayfalar yerine sonsuz kaydırma / "daha fazla yükle" etrafında tasarlayın. (Bir Select: 'COUNT' sorgusu, onları saymak için eşleşen her item'ı yine de okur — ve faturalandırır.)

API'ler için durumsuz imleçler

LastEvaluatedKey, yalnızca son item'ın anahtar attribute'larıdır. Onu base64 kodlayın ve istemcilere opak bir nextToken olarak verin; bir sonraki istekte onu tekrar ExclusiveStartKey'e çözün. Sunucu tarafında imleç durumu yok.

O token DynamoDB-JSON'dur — birini DynamoDB-JSON dönüştürücüsüyle gözle inceleyin veya elle hazırlayın. Ve eğer bir Scan'in etrafından dolanmak için sayfalıyorsanız, bu genellikle onun yerine bir index eklemeniz gerektiğinin bir işaretidir.

Döngüyü yazmayı tamamen atlamak için, sorgu oluşturucu tam Query/Scan isteğini bir araya getirir ve çalıştırılabilir bir SDK v3, CLI veya boto3 programı yayar — sayfalama döngüsü dahil.

Sorgu sonuçlarını, imleç sizin için izlenerek görsel olarak sayfalamak için DynoTable'ı deneyin.

Güncellendi