Bosh sahifa Wiki Aggregation pipeline

Aggregation pipeline

Aggregation pipeline — hujjatlar yoki recordlar oqimini ketma-ket bosqichlardan o‘tkazib, filtrlash, o‘zgartirish, guruhlash va hisoblash bajaradigan query modeli. Atama MongoDB bilan keng bog‘liq bo‘lib, har stage avvalgi stage natijasini qabul qiladi va keyingisiga uzatadi. Pipeline deklarativ yoziladi, optimizer ayrim bosqichlarni qayta joylashtirishi yoki indeksga push qilishi mumkin.

Asosiy bosqichlar

$match predicate bo‘yicha hujjatlarni kamaytiradi. $project kerakli maydonlarni tanlaydi yoki yangi expression hisoblaydi. $group grouping key uchun accumulatorlar — count, sum, average, min yoki max — yuritadi. $sort tartiblaydi, $limit va $skip natija hajmini boshqaradi. $unwind arrayning har elementini alohida oqim recordiga aylantiradi.

$lookup boshqa collection bilan join bajaradi. $facet ayni inputdan bir nechta sub-pipeline natijasini bitta hujjatda chiqaradi. $bucket qiymatni diapazonlarga ajratadi. $setWindowFields partition va sort ichida running total yoki rank kabi window hisoblarini beradi.

Stage tartibi

Selektiv $match boshida bo‘lsa keyingi stage kam hujjat ko‘radi va indeksdan foydalanishi mumkin. Faqat kerakli maydonlarni erta qisqartirish network yoki memoryni kamaytiradi, ammo optimizer ko‘pincha projectionni o‘zi boshqaradi. $unwind record sonini ko‘paytirgani uchun undan oldin filter foydali.

$sort global blocking stage bo‘lib, barcha inputni ko‘rishi va xotira limitidan oshsa diskka spill qilishi mumkin. $sortdan keyin kichik $limit top-k optimizatsiyasiga imkon beradi. Indeks pipeline boshidagi match va sortni qoplasa in-memory sort kerak bo‘lmaydi.

Group va memory

$group har distinct key uchun state saqlaydi. Yuqori cardinality memoryni oshiradi. Shardlangan collectionda partial group har shardda bajarilib, keyin router natijalarni birlashtirishi mumkin. Agar group key shard keyga mos bo‘lsa data harakati kamayadi; aks holda merge node hot spotga aylanadi.

Accumulator semantikasi type va missing qiymatga bog‘liq. Son bo‘lmagan fieldni sum qilish, nullni countlash yoki arrayni setga yig‘ish aniq sinovdan o‘tadi. Floating-point yig‘indi parallel merge tartibiga qarab juda kichik farq berishi mumkin.

Optimizer va explain

Optimizer matchni projectiondan oldinga surishi, ketma-ket matchlarni birlashtirishi yoki lookup sub-pipelinega predicate uzatishi mumkin. Har o‘zgarish semantik jihatdan xavfsiz bo‘lishi kerak. explain indeks, scanned hujjatlar, stage cardinality, sort spill va execution vaqtini ko‘rsatadi.

Pipeline sekin bo‘lsa faqat yakuniy vaqt emas, qaysi stage record sonini keskin oshirgan yoki kamaytirgani tekshiriladi. Data taqsimoti o‘zgarsa oldin samarali reja yomonlashishi mumkin. Index workloadning eng muhim match, sort va join patterniga mos tanlanadi.

Natijani yozish

$merge yoki $out natijani collectionga materializatsiya qiladi. $merge key bo‘yicha insert, replace yoki update siyosatini belgilaydi. Retry idempotent bo‘lishi va source bilan target bir xil bo‘lsa feedback loop yaratmasligi kerak. Long-running pipeline snapshot yoki read concernga qarab bir vaqt holatini yoki turli vaqtdagi o‘zgarishlarni ko‘rishi mumkin.

User input expression va field nomlariga nazoratsiz qo‘shilsa query injection yoki qimmat pipeline xavfi tug‘iladi. API ruxsat etilgan stage, field, limit va maksimal vaqtni cheklaydi. Aggregation natijasining ma’nosi data type, timezone, collation va missing-field qoidasi bilan hujjatlashtiriladi.

Pipeline bosqichlari ketma-ketligi natijani o‘zgartirmasa ham unumdorlikni o‘zgartirishi mumkin. Erta filtrlash keyingi bosqichlarga uzatiladigan hujjatlar sonini kamaytiradi, ammo hisoblangan maydonga bog‘liq filtrni hisoblashdan oldin ko‘chirib bo‘lmaydi. Optimallashtirishda semantik tenglik saqlanishi shart.

Bog‘liq tushunchalar

MongoDB, Collection, Aggregation, Query pipeline, Grouping, Index, Query optimizer