MongoDB Academy · Pelajaran

Struktur Dokumen Peristiwa Perubahan

Pelajar akan memeriksa medan peristiwa perubahan—operationType, fullDocument, updateDescription, ns dan documentKey—serta mengendalikan setiap jenis operasi.

Pelajaran 2 daripada 413 langkah

Struktur Dokumen Peristiwa Perubahan ialah pelajaran MongoDB Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran MongoDB Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus MongoDB Academy merangkumi sejumlah 4 pelajaran.

Anatomi Dokumen Peristiwa Perubahan

Setiap peristiwa yang dihantar oleh change stream ialah dokumen peristiwa perubahan dengan set medan piawai. Medan yang paling penting ialah operationType (perkara yang berlaku), ns (ruang nama yang terjejas), documentKey (_id dokumen yang terjejas) dan medan khusus operasi seperti fullDocument serta updateDescription. Memahami struktur ini membolehkan anda menulis pengendali peristiwa yang bertindak balas dengan betul terhadap setiap jenis operasi.

Medan operationType

Medan operationType mengenal pasti jenis perubahan yang berlaku. Nilai biasa termasuk: 'insert' (dokumen baharu ditambah), 'update' (medan dokumen diubah suai), 'replace' (keseluruhan dokumen digantikan), 'delete' (dokumen dialih keluar) dan 'invalidate' (change stream telah dibatalkan, contohnya koleksi digugurkan). Terdapat juga 'drop', 'rename' dan 'dropDatabase' untuk operasi koleksi/pangkalan data.

for await (const change of changeStream) {
  switch (change.operationType) {
    case 'insert':   handleInsert(change); break;
    case 'update':   handleUpdate(change); break;
    case 'replace':  handleReplace(change); break;
    case 'delete':   handleDelete(change); break;
    case 'invalidate':
      console.log('Change stream invalidated — collection may have been dropped');
      await changeStream.close();
      break;
    default:
      console.log('Other operation:', change.operationType);
  }
}

Medan ns (Ruang Nama)

Medan ns mengandungi ruang nama koleksi yang terjejas sebagai objek dengan dua sifat: ns.db (nama pangkalan data) dan ns.coll (nama koleksi). Medan ini penting apabila anda membuka change stream pada peringkat pangkalan data atau client, kerana peristiwa daripada berbilang koleksi tiba pada stream yang sama. Gunakan ns.coll untuk menghalakan peristiwa kepada pengendali yang betul.

// Database-level stream receives events from all collections
const dbStream = client.db('ecommerce').watch();

for await (const change of dbStream) {
  const collectionName = change.ns.coll;
  const database = change.ns.db;

  if (collectionName === 'orders') {
    await handleOrderChange(change);
  } else if (collectionName === 'products') {
    await handleProductChange(change);
  }
}

Medan documentKey

Medan documentKey mengandungi _id dokumen yang terjejas oleh perubahan tersebut. Medan ini hadir pada semua jenis operasi kecuali 'invalidate' dan operasi pada peringkat koleksi. Bagi koleksi terpecah, documentKey mungkin turut mengandungi medan kunci serpihan bersama-sama _id. Medan ini membolehkan anda mengenal pasti dokumen tertentu yang berubah tanpa perlu membaca dokumen sepenuhnya.

// documentKey is available on all CRUD events
for await (const change of changeStream) {
  const affectedId = change.documentKey._id;
  console.log('Document affected:', affectedId);

  // Use the ID to invalidate cache entries
  if (change.operationType === 'update' || change.operationType === 'delete') {
    cache.invalidate(affectedId.toString());
  }
}

Peristiwa Sisipan: Medan fullDocument

Bagi operasi 'insert', peristiwa perubahan menyertakan medan fullDocument yang mengandungi dokumen lengkap yang disisipkan, termasuk _id yang dijana secara automatik. Medan ini tersedia secara lalai untuk peristiwa sisipan—tidak seperti peristiwa kemas kini yang memerlukan pilihan updateLookup. Gunakannya untuk memproses data baharu dengan serta-merta tanpa mengeluarkan pertanyaan susulan.

// Insert event structure:
// {
//   _id: { _data: '...' },           // resume token
//   operationType: 'insert',
//   ns: { db: 'shop', coll: 'orders' },
//   documentKey: { _id: ObjectId('...') },
//   fullDocument: {                   // the inserted document
//     _id: ObjectId('...'),
//     customerId: '123',
//     total: 49.99,
//     status: 'pending'
//   }
// }

if (change.operationType === 'insert') {
  await sendOrderConfirmationEmail(change.fullDocument.customerId, change.fullDocument);
}

Peristiwa Kemas Kini: Medan updateDescription

Untuk operasi 'update', peristiwa perubahan menyertakan objek updateDescription dan bukannya dokumen penuh. Objek ini mempunyai dua submedan: updatedFields (pemetaan laluan medan kepada nilai baharunya) dan removedFields (tatasusunan laluan medan yang telah dinyahset). Format delta ini padat dan cekap—ia hanya melaporkan perkara yang berubah, bukan keseluruhan keadaan dokumen.

// Update event structure:
// {
//   operationType: 'update',
//   documentKey: { _id: ObjectId('...') },
//   updateDescription: {
//     updatedFields: {
//       'status': 'shipped',
//       'tracking.number': 'TRACK123'
//     },
//     removedFields: ['processingNotes']
//   }
// }

if (change.operationType === 'update') {
  const fields = change.updateDescription.updatedFields;
  if (fields.status === 'shipped') {
    await sendShippingNotification(change.documentKey._id);
  }
}

Peristiwa replace: Penggantian Penuh

Peristiwa 'replace' berlaku apabila replaceOne() dipanggil, yang menggantikan keseluruhan dokumen (kecuali _id). Peristiwa perubahan menyertakan fullDocument dengan dokumen baharu yang lengkap. Ini berbeza daripada peristiwa kemas kini kerana tiada updateDescription—anda tidak dapat mengetahui perkara yang berubah, hanya keadaan baharu dokumen tersebut. Proseskan peristiwa replace seperti peristiwa insert: baca keadaan baharu yang lengkap daripada fullDocument.

// Replace event — includes the complete new document
if (change.operationType === 'replace') {
  const newDocument = change.fullDocument;
  // Re-index the entire document
  await searchIndex.replace(newDocument._id, newDocument);
}

Peristiwa delete: Hanya _id

Untuk peristiwa 'delete', medan fullDocument ialah null kerana dokumen tersebut telah tiada apabila anda memproses peristiwa itu. Hanya documentKey (yang mengandungi _id) tersedia dengan pasti. Jika pengendali delete anda memerlukan kandungan dokumen, anda mesti menyimpan maklumat yang berkaitan sebelum pemadaman (contohnya, dalam log audit) kerana strim perubahan tidak dapat mendapatkan semula dokumen yang telah dibuang.

// Delete event — fullDocument is null
// {
//   operationType: 'delete',
//   documentKey: { _id: ObjectId('...') },
//   fullDocument: null  // document is gone
// }

if (change.operationType === 'delete') {
  const deletedId = change.documentKey._id;
  // Remove from search index
  await searchIndex.delete(deletedId);
  // Remove from cache
  cache.delete(deletedId.toString());
  // Cannot access the document content anymore!
}

Token Resume (Medan _id)

Setiap peristiwa perubahan mempunyai token resume yang disimpan dalam medan _id (objek { _data: '...' }). Token ini mengenal pasti kedudukan peristiwa dalam oplog. Simpan token resume selepas memproses setiap peristiwa supaya apabila aplikasi anda dimulakan semula, aplikasi itu boleh menyambung semula strim dari tempat terakhir menggunakan pilihan resumeAfter atau startAfter. Ini membolehkan jaminan penghantaran sekurang-kurangnya sekali.

// Save resume token after each event
for await (const change of changeStream) {
  await processChange(change);
  // Persist the token so we can resume after restart
  await db.collection('resumeTokens').updateOne(
    { streamId: 'orderStream' },
    { $set: { token: change._id } },
    { upsert: true }
  );
}

Mengendalikan Peristiwa invalidate

Peristiwa 'invalidate' menandakan bahawa strim perubahan tidak lagi boleh diteruskan—biasanya kerana collection yang dipantau telah digugurkan, pangkalan data telah digugurkan, atau set replika mengalami pengembalian semula. Selepas peristiwa invalidate, strim perubahan ditutup secara automatik. Aplikasi anda hendaklah mengendalikannya dengan membuka semula strim (atau memberi amaran kepada pentadbir), bukannya mengabaikannya. Periksa jenis 'invalidate' dan tentukan sama ada mahu membuka semula strim atau mematikannya.

for await (const change of changeStream) {
  if (change.operationType === 'invalidate') {
    console.warn('Change stream invalidated (collection may have been dropped)');
    // Optionally reopen after the collection is recreated
    await changeStream.close();
    break;
  }
  await processChange(change);
}

Contoh Pengendali Peristiwa Lengkap

Menggabungkan semua jenis peristiwa ke dalam satu pengendali teguh dengan penghalaan berasaskan switch menjadikan kod lebih mudah diselenggara. Setiap kes hanya membaca medan yang dijamin tersedia untuk jenis operasi tersebut. Menambahkan log berstruktur yang merangkumi operationType, ruang nama dan documentKey memberikan keterlihatan yang baik terhadap perkara yang sedang diproses oleh strim perubahan anda.

async function handleChange(change) {
  const { operationType, ns, documentKey } = change;
  console.log('[' + ns.coll + '] ' + operationType + ' on ' + documentKey._id);

  switch (operationType) {
    case 'insert':
      await onInsert(change.fullDocument);
      break;
    case 'update':
      await onUpdate(documentKey._id, change.updateDescription.updatedFields);
      break;
    case 'replace':
      await onReplace(change.fullDocument);
      break;
    case 'delete':
      await onDelete(documentKey._id);
      break;
    case 'invalidate':
      throw new Error('Stream invalidated');
  }
}

Semakan Ringkas

Uji pemahaman anda tentang konsep MongoDB & pangkalan data NoSQL daripada pelajaran ini.

Ringkasan Pelajaran

Dalam pelajaran ini, anda telah mempelajari bahawa: setiap peristiwa perubahan mempunyai operationType, ns, documentKey dan medan khusus operasi seperti fullDocument dan updateDescription, peristiwa insert/replace menyertakan fullDocument tetapi peristiwa delete tidak (dokumen tersebut telah tiada), dan medan _id peristiwa ialah token resume yang digunakan untuk memulakan semula strim dari kedudukan yang diketahui. Seterusnya, kita akan meneroka penapisan peristiwa strim perubahan dengan saluran paip pengagregatan.

Percuma untuk bermula

Pelajari JavaScript dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
30
Pelajaran
120

Soalan Lazim

Adakah pelajaran “Struktur Dokumen Peristiwa Perubahan” percuma?

Ya — teks penuh “Struktur Dokumen Peristiwa Perubahan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus MongoDB Academy, tingkat taraf kepada CoddyKit PRO. Kursus MongoDB Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Struktur Dokumen Peristiwa Perubahan”?

Pelajar akan memeriksa medan peristiwa perubahan—operationType, fullDocument, updateDescription, ns dan documentKey—serta mengendalikan setiap jenis operasi. Anda berlatih MongoDB Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan MongoDB Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran MongoDB Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Struktur Dokumen Peristiwa Perubahan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran MongoDB Academy ini?

Ya. Setiap pelajaran MongoDB Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Membuka Strim Perubahan pada Koleksi
  2. Struktur Dokumen Peristiwa Perubahan
  3. Menapis Peristiwa Dengan Saluran Paip Agregasi
  4. Menyambung Semula Strim Perubahan Selepas Gangguan
← Kembali ke MongoDB Academy