Atlas Triggers va Functions — serverless logika

~20 daq · MongoDB · Atlas va Deployment

Muammodan boshlaylik

Vazifalar:

  • Yangi buyurtma tushganda — omborchiga Telegram xabar
  • Mahsulot narxi o'zgarganda — narxTarixi collection 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 document
  • context.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.log natijalari 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/appservices CLI 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