Corak Polimorfik dan Pemversian Skema
Pelajar akan mereka bentuk satu koleksi yang mengandungi dokumen dengan bentuk berbeza menggunakan pembeza jenis, serta membuat versi skema untuk membolehkan migrasi secara beransur-ansur.
Corak Polimorfik dan Pemversian Skema ialah pelajaran MongoDB Academy percuma di CoddyKit. Ini ialah pelajaran 3 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.
Dokumen dengan Bentuk Berbeza
Salah satu kelebihan terbesar MongoDB berbanding SQL ialah dokumen dalam collection yang sama tidak perlu berkongsi medan yang sama. Ini membolehkan Corak Polimorfik — menyimpan dokumen daripada jenis yang pada asasnya berbeza dalam satu collection. Bayangkan collection vehicles yang menyimpan kereta, trak dan motosikal: semuanya mempunyai make dan year, tetapi hanya kereta mempunyai numberOfDoors dan hanya motosikal mempunyai hasSidecar.
// Polymorphic documents in one 'vehicles' collection
{ _id: ObjectId(), type: 'car', make: 'Toyota', year: 2022, numberOfDoors: 4, fuelType: 'hybrid' }
{ _id: ObjectId(), type: 'truck', make: 'Ford', year: 2021, payloadKg: 1200, hasTrailerHitch: true }
{ _id: ObjectId(), type: 'motorcycle', make: 'Honda', year: 2023, engineCC: 750, hasSidecar: false }Medan Pembeza Jenis
Kunci kepada Corak Polimorfik ialah medan pembeza jenis — medan (biasanya dinamakan type, kind atau _type) yang mengenal pasti subjenis yang diwakili oleh sesuatu dokumen. Semua kod aplikasi dan indeks boleh menggunakan medan ini untuk mengarahkan tingkah laku dengan betul. Indekskan medan pembeza supaya pertanyaan yang menapis mengikut jenis dilaksanakan sebagai IXSCAN dan bukannya COLLSCAN.
// Index the type discriminator
db.vehicles.createIndex({ type: 1 })
// Query only cars
db.vehicles.find({ type: 'car', fuelType: 'hybrid' })
// Query all vehicles regardless of type
db.vehicles.find({ make: 'Toyota' })Polimorfisme dalam Kod Aplikasi
Kod aplikasi mengendalikan dokumen polimorfik dengan corak kilang atau strategi: periksa medan type dan serahkan tugas kepada kelas atau fungsi pengendali yang sesuai. Dalam Node.js/Mongoose, anda boleh menggunakan pembeza — ciri terbina dalam Mongoose yang mentakrifkan subskema bagi setiap jenis dokumen dalam satu collection, serta menetapkan dan membaca kunci pembeza secara automatik.
// Mongoose discriminators
const vehicleSchema = new mongoose.Schema({ make: String, year: Number })
const Vehicle = mongoose.model('Vehicle', vehicleSchema)
const Car = Vehicle.discriminator('car', new mongoose.Schema({
numberOfDoors: Number,
fuelType: String
}))
const Motorcycle = Vehicle.discriminator('motorcycle', new mongoose.Schema({
engineCC: Number,
hasSidecar: Boolean
}))
// Mongoose automatically sets __t discriminator field
await Car.create({ make: 'Toyota', year: 2022, numberOfDoors: 4, fuelType: 'hybrid' })Bila Hendak Menggunakan Polimorfik Berbanding Collection Berasingan
Gunakan Pola Polimorfik apabila subjenis yang berbeza berkongsi sebahagian besar medan dan sering ditanya bersama. Satu koleksi vehicles memudahkan anda membuat pertanyaan seperti ‘paparkan semua kenderaan Toyota tanpa mengira jenis’. Gunakan koleksi berasingan apabila subjenis hampir sepenuhnya berbeza, jarang ditanya bersama, atau mempunyai keperluan pengindeksan yang sangat berbeza. Polimorfisme menukarkan pertanyaan merentas jenis yang lebih mudah dengan logik bagi setiap jenis yang sedikit lebih kompleks.
Pola Pemversian Skema
Aplikasi berkembang dan skema berubah, tetapi anda tidak boleh menghentikan seluruh sistem untuk memindahkan setiap dokumen sekaligus. Pola Pemversian Skema menambahkan medan schema_version pada setiap dokumen. Dokumen lama mempunyai versi 1 (atau tiada medan versi dan dianggap sebagai v1), manakala dokumen baharu mempunyai versi 2. Kod aplikasi menyemak versi dan menggunakan transformasi yang sesuai, lalu membolehkan pemindahan beransur-ansur tanpa masa henti.
// Version 1 document (old shape)
{ _id: ObjectId(), name: 'Alice Smith', phone: '555-1234', schema_version: 1 }
// Version 2 document (new shape — phone normalised)
{
_id: ObjectId(),
name: 'Bob Jones',
contact: {
phone: '+15551234', // normalised E.164 format
email: 'bob@example.com'
},
schema_version: 2
}Membaca Dengan Kesedaran Versi
Semasa membaca dokumen, semak schema_version dan kendalikan setiap versi dengan sewajarnya dalam lapisan transformasi. Kod yang tidak bergantung pada versi memanggil fungsi transformasi dan sentiasa menerima objek kanonik. Ini mengasingkan logik aplikasi daripada bentuk dokumen tersimpan serta memberi anda masa untuk memindahkan dokumen di latar belakang tanpa pertukaran besar secara mendadak.
function normaliseUser(doc) {
if (!doc.schema_version || doc.schema_version === 1) {
// Upgrade v1 shape to canonical v2 shape in memory
return {
...doc,
contact: { phone: doc.phone, email: null },
schema_version: 2
}
}
return doc // already v2
}
const rawDoc = await db.collection('users').findOne({ _id: userId })
const user = normaliseUser(rawDoc)
console.log(user.contact.phone) // works for both v1 and v2 docsPemindahan Malas: Naik Taraf Semasa Menulis
Pemindahan malas menaik taraf dokumen kepada skema baharu apabila dokumen tersebut diakses secara semula jadi. Apabila dokumen dibaca dan ditransformasikan kepada v2 dalam memori, tulis semula bentuk v2 ke pangkalan data. Lama-kelamaan, semua dokumen aktif dipindahkan tanpa skrip pukal. Dokumen tidak aktif boleh dipindahkan oleh kerja latar belakang. Pendekatan ini berisiko rendah — tiada satu pemindahan besar yang perlu diselaraskan atau dikembalikan.
async function getAndUpgradeUser(userId) {
const doc = await db.collection('users').findOne({ _id: userId })
const user = normaliseUser(doc)
// If doc was v1, write v2 shape back
if (!doc.schema_version || doc.schema_version < 2) {
await db.collection('users').replaceOne(
{ _id: userId },
{ ...user, schema_version: 2 }
)
}
return user
}Skrip Migrasi Latar Belakang Pukal
Untuk pemindahan yang lebih pantas, jalankan skrip latar belakang yang mengulangi semua dokumen v1 secara berkumpulan menggunakan kursor, mentransformasikannya, kemudian menulisnya semula menggunakan bulkWrite(). Proses dokumen secara berkumpulan (contohnya, 1,000 pada satu-satu masa) untuk mengelakkan pelayan dibebani secara berlebihan. Jalankan proses ini pada waktu luar puncak dan sertakan kelewatan antara kumpulan untuk mengehadkan kesannya terhadap trafik pengeluaran.
async function migrateUsers() {
const cursor = db.collection('users').find(
{ schema_version: { $lt: 2 } },
{ batchSize: 1000 }
)
let batch = []
for await (const doc of cursor) {
const upgraded = normaliseUser(doc)
batch.push({
replaceOne: {
filter: { _id: doc._id },
replacement: { ...upgraded, schema_version: 2 }
}
})
if (batch.length === 1000) {
await db.collection('users').bulkWrite(batch)
batch = []
}
}
if (batch.length > 0) await db.collection('users').bulkWrite(batch)
}Menggabungkan Pola Polimorfik dan Pemversian Skema
Kedua-dua pola ini boleh digunakan bersama. Koleksi polimorfik mungkin mempunyai kedua-dua pembeza type (untuk penghantaran subjenis) dan schema_version (untuk pemindahan evolusi dalam setiap subjenis). Apabila dokumen jenis 'car' memperoleh medan wajib baharu dalam v2, medan versi menjejak kereta yang telah dipindahkan dan kereta yang masih menggunakan bentuk lama.
// A polymorphic, versioned document
{
_id: ObjectId(),
type: 'car',
schema_version: 2,
make: 'Toyota',
year: 2022,
numberOfDoors: 4,
// v2 added fuelType
fuelType: 'hybrid'
}Pengindeksan Merentas Subjenis Polimorfik
Indeks dalam koleksi polimorfik digunakan merentas semua jenis dokumen. Indeks separa (menggunakan partialFilterExpression) membolehkan anda mengindeks sesuatu medan hanya untuk dokumen daripada jenis tertentu — contohnya, mengindeks numberOfDoors hanya untuk dokumen kereta. Ini mengelakkan pengindeksan nilai null atau nilai yang tiada bagi jenis yang tidak mempunyai medan tersebut, sekali gus memastikan indeks kekal kecil dan cekap.
// Partial index: index numberOfDoors only for cars
db.vehicles.createIndex(
{ numberOfDoors: 1 },
{
partialFilterExpression: { type: 'car' },
name: 'car_doors_idx'
}
)
// Index engineCC only for motorcycles
db.vehicles.createIndex(
{ engineCC: 1 },
{ partialFilterExpression: { type: 'motorcycle' } }
)Antipola: Mengabaikan Versi Skema
Kesilapan yang lazim ialah mengemas kini skema tanpa menjejak versi, dengan anggapan bahawa semua dokumen akan dipindahkan sebelum kod baharu digunakan. Dalam amalan, pemindahan jarang sekali lengkap 100% pada masa penggunaan kod. Kod yang membaca medan secara membuta tuli sedangkan medan itu mungkin tiada dalam dokumen lama akan menghasilkan ralat penuding null atau keputusan yang tidak betul. Sentiasa sertakan semakan versi atau sandaran selamat apabila membaca medan yang mungkin tiada.
// DANGEROUS: assumes all docs have contact.email
const email = user.contact.email // TypeError if doc is v1
// SAFE: optional chaining with fallback
const email = user.contact?.email ?? user.email ?? nullSemakan Pantas
Uji pemahaman anda tentang konsep MongoDB & pangkalan data NoSQL daripada pelajaran ini.
Ulang Kaji Pelajaran
Dalam pelajaran ini, anda telah mempelajari bahawa Pola Polimorfik menyimpan subjenis dokumen yang berbeza dalam satu koleksi menggunakan medan pembeza jenis, sekali gus membolehkan pertanyaan merentas jenis yang cekap dan sokongan pembeza Mongoose; Pola Pemversian Skema menjejak evolusi bentuk dokumen dengan medan versi, sekali gus membolehkan pemindahan malas atau pemindahan latar belakang tanpa masa henti; dan indeks separa menjadikan koleksi polimorfik lebih cekap dengan mengindeks medan hanya untuk jenis yang memilikinya. Seterusnya, kita akan membincangkan Pola Pencilan dan Pola Struktur Pepohon.
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 Polimorfik dan Pemversian Skema” percuma?
Ya — teks penuh “Corak Polimorfik dan Pemversian Skema” 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 Polimorfik dan Pemversian Skema”?
Pelajar akan mereka bentuk satu koleksi yang mengandungi dokumen dengan bentuk berbeza menggunakan pembeza jenis, serta membuat versi skema untuk membolehkan migrasi secara beransur-ansur. 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 3 daripada 4.
Berapa lamakah pelajaran “Corak Polimorfik dan Pemversian Skema” 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
- Corak Baldi dan Pengiraan
- Corak Rujukan Lanjutan dan Subset
- Corak Polimorfik dan Pemversian Skema
- Corak Pencilan dan Struktur Pepohon