MongoDB Academy · Pelajaran

Corak Pencilan dan Struktur Pepohon

Pelajar akan mengendalikan dokumen dengan tatasusunan yang luar biasa besar menggunakan corak pencilan, serta memodelkan data pepohon hierarki dengan rujukan induk atau laluan terwujud.

Pelajaran 4 daripada 413 langkah

Corak Pencilan dan Struktur Pepohon ialah pelajaran MongoDB Academy percuma di CoddyKit. Ini ialah pelajaran 4 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.

Masalah Pencilan

Kebanyakan koleksi MongoDB mempunyai dokumen yang mengikut taburan saiz yang boleh dijangka. Namun, kadangkala terdapat pencilan — dokumen yang menyimpang jauh daripada kebiasaan. Kiriman media sosial yang menjadi tular mungkin mengumpulkan 50,000 ulasan sedangkan kiriman biasa mempunyai 5–20 ulasan. Produk yang disukai selebriti mungkin mempunyai 10,000 ulasan. Mereka bentuk skema berdasarkan kes purata sambil mengabaikan pencilan boleh menyebabkan dokumen akhirnya mencapai had saiz dokumen 16 MB atau menimbulkan tekanan memori.

Mengesan Dokumen Pencilan

Sebelum mereka bentuk penyelesaian untuk pencilan, kenal pasti sama ada pencilan benar-benar wujud dalam data anda. Gunakan pipeline agregasi untuk mencari dokumen dengan tatasusunan yang luar biasa besar. Tetapkan ambang berdasarkan julat normal yang dijangka — jika 99% kiriman mempunyai kurang daripada 100 ulasan, dokumen yang mempunyai lebih daripada 1,000 ulasan ialah pencilan yang wajar dikendalikan secara khusus.

// Find posts with outlier-level comment counts
db.posts.aggregate([
  {
    $project: {
      title: 1,
      commentCount: { $size: { $ifNull: ['$comments', []] } }
    }
  },
  { $match: { commentCount: { $gt: 1000 } } },
  { $sort: { commentCount: -1 } },
  { $limit: 10 }
])

Pola Pencilan: Bendera Limpahan

Pola Pencilan memastikan kes biasa kekal pantas dengan menyematkan tatasusunan sehingga ambang tertentu, serta mengendalikan dokumen luar biasa dengan menetapkan bendera hasOverflow dan menyimpan item limpahan dalam koleksi berasingan. Kod aplikasi menyemak bendera tersebut — jika false (kes biasa), kod menggunakan tatasusunan yang disematkan. Jika true (kes pencilan), kod melaksanakan pertanyaan tambahan kepada koleksi limpahan.

// Normal post document (99% of posts)
{ _id: ObjectId(), title: 'Regular Post', comments: [/* up to 100 */], hasOverflow: false }

// Outlier post document
{
  _id: ObjectId(),
  title: 'Viral Post',
  comments: [/* first 100 comments */],
  hasOverflow: true  // more comments in overflow collection
}

// Overflow collection document
{ postId: ObjectId('...'), comments: [/* comments 101-5000 */] }

Membaca Dengan Pola Pencilan

Kod aplikasi mesti mengendalikan bendera pencilan secara jelas. Kebanyakan masa, bendera itu ialah false dan operasi membaca berlangsung dengan pantas. Untuk dokumen pencilan, laksanakan pertanyaan limpahan tambahan. Ini memastikan laluan biasa dioptimumkan sambil mengendalikan kes luar biasa dengan betul, tanpa membesarkan dokumen biasa atau mencapai had 16 MB.

async function getPostWithComments(postId) {
  const post = await db.collection('posts').findOne({ _id: postId })

  if (!post.hasOverflow) {
    return post  // fast path — all comments embedded
  }

  // Outlier path — fetch additional comments from overflow
  const overflow = await db.collection('postOverflow').findOne({ postId })
  return {
    ...post,
    comments: [...post.comments, ...(overflow?.comments ?? [])]
  }
}

Pengenalan kepada Pola Struktur Pepohon

Data hierarki — kategori produk, carta organisasi, sistem fail, dan utas ulasan — muncul dalam hampir setiap aplikasi. MongoDB tidak mempunyai jenis data pepohon asli, jadi struktur tersebut mesti dimodelkan dalam skema dokumen. Terdapat empat pola pepohon yang lazim, setiap satunya dioptimumkan untuk corak capaian pertanyaan yang berbeza: Rujukan Induk, Rujukan Anak, Tatasusunan Leluhur dan Laluan Terwujud.

Rujukan Induk: Hierarki Mudah

Pola Rujukan Induk menyimpan setiap nod dengan satu medan parent yang menunjuk kepada _id induknya. Nod akar mempunyai parent: null. Ini ialah perwakilan yang paling mudah dan mencerminkan cara pepohon set bersarang atau senarai bersebelahan SQL berfungsi. Ia cekap untuk mencari induk langsung sesuatu nod atau anak langsung, tetapi memerlukan pertanyaan rekursif untuk merentasi beberapa aras.

// Category tree with Parent References
db.categories.insertMany([
  { _id: 1, name: 'Electronics',   parent: null },
  { _id: 2, name: 'Phones',        parent: 1 },
  { _id: 3, name: 'Laptops',       parent: 1 },
  { _id: 4, name: 'Smartphones',   parent: 2 },
  { _id: 5, name: 'Feature Phones',parent: 2 }
])

// Find direct children of 'Electronics'
db.categories.find({ parent: 1 })

Tatasusunan Leluhur: Carian Leluhur Pantas

Pola Tatasusunan Leluhur menyimpan laluan penuh dari akar ke nod semasa dalam tatasusunan ancestors. Ini memudahkan jawapan kepada soalan ‘adakah X leluhur kepada Y?’ dengan semakan keahlian tatasusunan yang ringkas. Ia juga memudahkan pencarian semua keturunan sesuatu nod — buat pertanyaan untuk dokumen yang tatasusunan ancestors-nya mengandungi _id nod tersebut. Pertukarannya ialah pemindahan subpepohon memerlukan semua dokumen keturunan dikemas kini.

// Array of Ancestors pattern
db.categories.insertMany([
  { _id: 1, name: 'Electronics',   ancestors: [] },
  { _id: 2, name: 'Phones',        ancestors: [1] },
  { _id: 4, name: 'Smartphones',   ancestors: [1, 2] }  // root→Electronics→Phones
])

// Find all descendants of Electronics (id=1)
db.categories.find({ ancestors: 1 })

// Check if Electronics is an ancestor of Smartphones
db.categories.findOne({ _id: 4, ancestors: 1 })  // not null = yes

Laluan Terwujud: Pepohon Berasaskan Rentetan

Pola Laluan Terwujud menyimpan laluan penuh sebagai rentetan (contohnya, '/Electronics/Phones/Smartphones'). Ia membolehkan pertanyaan awalan untuk mencari semua nod di bawah sesuatu subpepohon, serta pertanyaan ungkapan nalar untuk mencari dalam segmen laluan. Pola ini sepadan secara semula jadi dengan laluan sistem fail atau hierarki URL. Ia cekap untuk carian leluhur dan penyenaraian keturunan, tetapi boleh menjadi rapuh apabila nod dinamakan semula atau dipindahkan.

// Materialised Path pattern
db.categories.insertMany([
  { _id: 1, name: 'Electronics', path: ',1,' },
  { _id: 2, name: 'Phones',      path: ',1,2,' },
  { _id: 4, name: 'Smartphones', path: ',1,2,4,' }
])

// Find all descendants of Phones (id=2) — path contains ',2,'
db.categories.find({ path: /,2,/ })

// Find the full path ancestors of Smartphones
db.categories.find({ _id: { $in: [1, 2] } })  // parse path and lookup ids

Memilih Pola Pepohon yang Sesuai

Pilih pola pepohon berdasarkan pertanyaan yang paling kerap anda gunakan: Rujukan Induk — mudah dan sesuai untuk perayauan dengan rekursi pada sisi aplikasi; Rujukan Anak — menyematkan tatasusunan anak langsung, pantas untuk membaca satu aras; Tatasusunan Leluhur — pantas untuk carian leluhur dan pertanyaan subpepohon, tetapi mahal untuk pemindahan; Laluan Terwujud — pantas untuk pertanyaan subpepohon berasaskan ungkapan nalar, tetapi rapuh apabila nama ditukar. Pendekatan hibrid (menyimpan kedua-dua induk dan leluhur) menukarkan kerumitan penulisan dengan kelajuan membaca.

Rujukan Anak: Menyematkan Anak Langsung

Pola Rujukan Anak menyematkan tatasusunan nilai _id anak langsung dalam setiap dokumen nod. Ini membolehkan semua anak sesuatu nod diperoleh dengan pantas dalam satu bacaan (tiada pertanyaan berasingan diperlukan). Pola ini sesuai untuk pepohon yang kerap dibaca dari atas ke bawah (contohnya, menu memaparkan anak dengan serta-merta). Pertukarannya ialah tatasusunan anak boleh menjadi besar bagi nod yang mempunyai banyak anak, dan anda tidak boleh mencari induk sesuatu nod dengan cekap tanpa indeks atau medan tambahan.

// Child References pattern
db.categories.insertMany([
  { _id: 1, name: 'Electronics', children: [2, 3] },
  { _id: 2, name: 'Phones',      children: [4, 5] },
  { _id: 3, name: 'Laptops',     children: [] },
  { _id: 4, name: 'Smartphones', children: [] },
  { _id: 5, name: 'Feature Phones', children: [] }
])

// Get direct children of Electronics in one read
const parent = db.categories.findOne({ _id: 1 })
const children = db.categories.find({ _id: { $in: parent.children } }).toArray()

Menggunakan $graphLookup untuk Perayauan Pepohon

Peringkat agregasi $graphLookup MongoDB mengikuti medan rujukan secara rekursif untuk merayau pepohon atau graf yang disimpan menggunakan mana-mana pola. Ia mengembalikan semua nod yang boleh dicapai sehingga kedalaman yang ditentukan. Gunakannya bersama Rujukan Induk atau Rujukan Anak untuk merayau hierarki tanpa menulis kod aplikasi rekursif. Tetapkan maxDepth untuk mengelakkan gelung tanpa penghujung dalam graf berbentuk kitaran.

// Traverse all descendants of Electronics using $graphLookup
db.categories.aggregate([
  { $match: { _id: 1 } },  // start from Electronics
  {
    $graphLookup: {
      from: 'categories',
      startWith: '$_id',
      connectFromField: '_id',
      connectToField: 'parent',
      as: 'descendants',
      maxDepth: 10
    }
  }
])

Semakan Pantas

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

Ulang Kaji Pelajaran

Dalam pelajaran ini, anda telah mempelajari bahawa Pola Pencilan memastikan dokumen biasa kekal ringkas dengan menyematkan tatasusunan sehingga ambang tertentu dan menggunakan bendera hasOverflow untuk mengarahkan dokumen luar biasa ke koleksi limpahan; pola struktur pepohon (Rujukan Induk, Tatasusunan Leluhur, Laluan Terwujud) masing-masing dioptimumkan untuk corak capaian pertanyaan yang berbeza pada data hierarki; dan $graphLookup merayau rujukan secara rekursif dalam pipeline tanpa rekursi pada sisi aplikasi. Seterusnya, kita akan membandingkan MongoDB dengan Redis untuk beban kerja dokumen berbanding nilai kunci.

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 “Corak Pencilan dan Struktur Pepohon” percuma?

Ya — teks penuh “Corak Pencilan dan Struktur Pepohon” 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 “Corak Pencilan dan Struktur Pepohon”?

Pelajar akan mengendalikan dokumen dengan tatasusunan yang luar biasa besar menggunakan corak pencilan, serta memodelkan data pepohon hierarki dengan rujukan induk atau laluan terwujud. 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 4 daripada 4.

Berapa lamakah pelajaran “Corak Pencilan dan Struktur Pepohon” 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. Corak Baldi dan Pengiraan
  2. Corak Rujukan Lanjutan dan Subset
  3. Corak Polimorfik dan Pemversian Skema
  4. Corak Pencilan dan Struktur Pepohon
← Kembali ke MongoDB Academy