Atlas Triggers va Functions — serverless logika
Muammodan boshlaylik
Vazifalar:
- Yangi buyurtma tushganda — omborchiga Telegram xabar
- Mahsulot narxi o'zgarganda —
narxTarixicollection iga yozish - Har kecha soat 3 da — 30 kundan eski savatlarni tozalash
- Admin paneldan, skriptdan yoki boshqa xizmatdan qilingan o'zgarishlar ham hisobga olinsin
Express middleware da yozsangiz — faqat shu ilova orqali qilingan o'zgarishlar ushlanadi. Cron uchun esa alohida server yoki jarayon kerak.
Triggers nima?
Atlas Triggers — ma'lum hodisa yuz berganda Atlas ning o'zida bajariladigan serverless funksiyalar:
| Trigger turi | Qachon ishlaydi |
|---|---|
| Database | Collection da insert, update, replace, delete |
| Scheduled | Jadval bo'yicha (cron) |
| Authentication | Foydalanuvchi ro'yxatdan o'tganda/kirganda (App Services auth) |
Funksiyalar JavaScript da yoziladi va Atlas serverlarida ishlaydi — sizga server kerak emas.
Hayotiy o'xshatma
Uyda "aqlli" tizim: eshik ochilganda — chiroq yonadi (database trigger), har kuni soat 7 da — choynak qaynaydi (scheduled trigger). Siz har safar o'zingiz chiroqni yoqishingiz shart emas va kim eshikni ochganidan qat'i nazar — chiroq yonadi.
Change Streams — asos
Database trigger lar MongoDB ning Change Streams imkoniyatiga asoslangan — collection dagi o'zgarishlar oqimiga obuna bo'lish. Uni o'z ilovangizda ham to'g'ridan-to'g'ri ishlatish mumkin:
const oqim = Buyurtma.watch([{ $match: { operationType: 'insert' } }])
oqim.on('change', (ozgarish) => {
console.log('Yangi buyurtma:', ozgarish.fullDocument._id)
})
Change Streams replica set talab qiladi. Atlas Triggers — buning boshqariladigan versiyasi: qayta ulanish, "qayerda to'xtagan edim" (resume token) va xatolar — Atlas tomonidan.
Database trigger yaratish
Atlas → Triggers → Add Trigger:
- Trigger Type: Database
- Cluster, Database:
dokon, Collection:buyurtmalar - Operation Type: Insert
- Full Document: ✅ (yangi documentni funksiyaga berish)
- Event Type: Function
exports = async function (changeEvent) {
const buyurtma = changeEvent.fullDocument
const token = context.values.get('telegramToken')
const chatId = context.values.get('omborChatId')
await context.http.post({
url: `https://api.telegram.org/bot${token}/sendMessage`,
body: {
chat_id: chatId,
text: `🛒 Yangi buyurtma #${buyurtma.raqam}\nSumma: ${buyurtma.summa.toLocaleString()} so'm`,
},
encodeBodyAsJSON: true,
})
}
changeEvent.fullDocument— yangi documentcontext.values/context.secrets— maxfiy qiymatlar (token kodga yozilmaydi)context.http— tashqi so'rovlar
Narx tarixi — update trigger
Operation Type: Update, Match Expression bilan faqat narx o'zgarishlari:
{ "updateDescription.updatedFields.narx": { "$exists": true } }
exports = async function (changeEvent) {
const db = context.services.get('mongodb-atlas').db('dokon')
const { _id } = changeEvent.documentKey
const yangiNarx = changeEvent.updateDescription.updatedFields.narx
await db.collection('narxTarixi').insertOne({
mahsulot: _id,
narx: yangiNarx,
sana: new Date(),
})
}
context.services.get('mongodb-atlas') — funksiya ichidan bazaga murojaat.
[!WARNING] Trigger o'zi kuzatayotgan collection ga yozsa — cheksiz sikl: o'zgarish → trigger → o'zgarish → trigger... Match Expression bilan o'z o'zgarishlaringizni filtrlang yoki boshqa collection ga yozing.
Scheduled trigger
Trigger Type: Scheduled, Schedule: 0 3 * * * (har kuni soat 03:00 UTC — Toshkent bilan 5 soat farqni hisobga oling).
exports = async function () {
const db = context.services.get('mongodb-atlas').db('dokon')
const chegara = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000)
const natija = await db.collection('savatlar').deleteMany({ yangilangan: { $lt: chegara } })
console.log(`O'chirildi: ${natija.deletedCount}`)
}
Hisobotlarni oldindan hisoblash ($merge, 18-dars), eskirgan ma'lumotlarni arxivlash uchun ham qulay.
[!TIP] Oddiy "N kundan keyin o'chirish" uchun trigger shart emas — TTL index (27-dars) buni MongoDB ning o'zida bepul va oddiyroq bajaradi.
Funksiyalar va loglar
- App Services → Functions — funksiyalarni yozish, sinash (Run), boshqa funksiyalardan chaqirish:
context.functions.execute('nom', arg) - Logs — har bir ishga tushish,
console.lognatijalari va xatolar - Funksiya vaqt va xotira chegaralariga ega — og'ir ishlar uchun emas
Trigger yoki ilova kodi
| Trigger | Ilova kodi (Express) |
|---|---|
| Barcha manbalardan o'zgarishlarni ushlaydi | Faqat shu ilova orqali |
| Server kerak emas | O'z serveringiz |
| Debug va test qilish qiyinroq | Odatdagi vositalar |
| Kod Atlas da — git da emas (agar App Services ni git bilan bog'lamasangiz) | Kod repozitoriyda |
| Kichik reaksiyalar: xabar, audit, sinxronlash | Asosiy biznes mantiq |
[!INFO] Trigger kodini versiyalash uchun App Services ni GitHub bilan bog'lash yoki
atlas/appservicesCLI orqali deploy qilish mumkin. Shunda trigger lar ham kod sifatida ko'rib chiqiladi.
Tez-tez uchraydigan xatolar
Maxfiy kalitlarni funksiya kodiga yozish
context.values va Secrets dan foydalaning.
Vaqt mintaqasini unutish
Cron — UTC da. "Soat 3 da" (Toshkent) — 0 22 * * * (UTC).
Trigger ni to'xtatib, unutish
Xato ko'p bo'lsa Atlas trigger ni to'xtatishi mumkin (suspended). Loglar va ogohlantirishlarni kuzatib boring; qayta yoqishda resume token dan davom ettirish mumkin.
Xulosa
- Atlas Triggers — hodisalarga javoban serverless funksiyalar: Database, Scheduled, Authentication
- Database trigger — Change Streams asosida;
changeEvent.fullDocument,updateDescription - Match Expression — faqat kerakli o'zgarishlar; o'z collection iga yozib cheksiz sikl yaratmang
- Scheduled — cron (UTC)
context.values/secrets,context.http,context.services- Oddiy muddatli o'chirish — TTL index; asosiy biznes mantiq — ilovada
Keyingi dars: 55-dars — Monitoring — Atlas Performance Advisor, slow queries