Başlangıç3 dakikalık okuma

DynamoDB'de Sayfalama

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

Döngü

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. Sonraki dilimi getirmek için onu ExclusiveStartKey olarak geri verin.

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

presentabsentQuery / ScanProcess ItemsLastEvaluatedKey?Set ExclusiveStartKeyDone

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 kaç item değerlendirdiğini sınırlar, bir FilterExpression'dan sonra kaç tanesini döndürdüğünü değil. Bir filtrenin arkası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 de asla daha fazla eşleşen item vaat etmez; yalnızca bulunmayan 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 sayfalar arasında doğrudan yineleyebilirsiniz:

// 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 numarası yok

DynamoDB'de toplam sayım ve rastgele sayfa erişimi yoktur — cursor'ları yeniden oynatmadan "sayfa 7"ye atlayamaz veya geriye doğru sayfalandıramazsınız. Arayüzleri numaralı sayfalar yerine sonsuz kaydırma / "daha fazla yükle" etrafında tasarlayın. (Bir Select: 'COUNT' sorgusu, onları saymak için yine de eşleşen her item'ı okur — ve faturalandırır.)

API'ler için durumsuz cursor'lar

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

Bu token DynamoDB-JSON'dur — birini DynamoDB-JSON dönüştürücüsü ile gözden geçirin veya elle oluşturun. Ve bir Scan'i atlatmak için sayfalama yapıyorsanız, bu genellikle bunun yerine bir index ekleme sinyalidir.

Sorgu sonuçları arasında, cursor sizin için izlenerek görsel olarak sayfalamak için DynoTable'ı deneyin.

Güncellendi