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:
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.