C# ile MongoDB okumaları: projection, sıralama ve sayfalama
Filtre doğru olsa da bir MongoDB okuması yanlış şekilde, belirsiz sırada veya sınırsız veriyle dönebilir. Nick Cosentino, MongoDB.Driver 3.12.0 üzerinden typed projection, benzersiz tie-breaker'lı sıralama, offset sayfalama ve compound continuation token ile okumayı daraltmayı anlatıyor. Yazı, sık tekrarlanan filtre anlatımını atlayıp "ne dönecek, hangi sırada, sonraki istek nasıl devam edecek" sorularına odaklanıyor.
Kilit noktalar
- Projection okuma şeklinin parçası: sadece gösterilen alanları değil, sonraki sayfaya devam için gereken boundary alanlarını da (Id, Sequence) seçin
- Azalan sıralamada benzersiz bir tie-breaker (_id) ekleyin; devam filtresinde iki alanın yönünü de aynı tutun
- Skip/Limit tabanlı offset sayfalama büyüyen offset'te önceki sonuçları işler ve araya ekleme/silmede kayar
- Küçük projection index coverage demek değil; gerçek plan ve deploy edilmiş index'lerle doğrulayın
- Continuation token filtresi, sıralama modu ve değer tipleriyle birlikte anlam kazanır; base müşteri filtresini onunla değiştirmeyin, birleştirin
- Limit dönen doküman sayısını sınırlar, sunucunun incelediği doküman sayısını garanti etmez
Filtreden sonra MongoDB okumasının üç ayrı parçası var: ne dönecek, hangi sırada ve ne kadar. MongoDB.Driver 3.12.0'daki expression tabanlı Project overload'u IFindFluent<TDocument, TNewProjection> döner; böylece bir özet tipi saklanan doküman tipinin yerine geçebilir. Ancak projection ile gelen kısmi nesne write modeli yerine kullanılmamalı, küçük bir anonymous tip de index coverage kanıtı sayılmamalı ve eksik alanlar varsayılan CLR değerleriyle gelebilir.
Sıralamada benzersiz bir tie-breaker şart: azalan Sequence tek başına eşit değerleri çözmez, bu yüzden örnekte azalan _id ile birleştiriliyor ve continuation filtresinde iki yön de tekrarlanıyor. Offset sayfalama numaralandırması kolay olsa da offset büyüdükçe sunucu önceki sonuçları işler ve araya giren dokümanlarla kayar; bu yüzden bağımsız istekler arasında snapshot garantisi yok.
Gerçek dünyada kullanımı
- Sayfa numarasıyla gezinen bir sipariş geçmişi ekranı için Skip/Limit ile sınırlı okuma
- Büyük müşteri koleksiyonlarında sonsuz kaydırma yapan bir liste için compound boundary ve continuation token
- Sadece özet alan döndüren bir dashboard endpoint'inde tam doküman yerine typed projection kullanmak
- Yüksek hacimli bir arka plan işinde ToListAsync yerine cursor üzerinden parça parça işleme
Neden önemli
Doğru filtre tek başına doğru endpoint üretmiyor; projection, benzersiz sıralama ve sınırlı sayfalama birlikte tasarlanmazsa API gereksiz alan döndürür ve sayfa sınırları kayar.