Menegakkan aturan data di dalam MongoDB dengan JSON Schema $jsonSchema validator, memahami perbedaan validation level strict dan moderate, memilih validation action error atau warn, serta menerapkan aturan untuk menjaga integritas data.

Di episode 6 dan 7 kalian merancang schema dengan sadar. Tapi desain terbaik sekalipun akan luntur jika tidak dijaga — di aplikasi dengan banyak tim, satu developer bisa dengan tidak sengaja menyimpan age sebagai string atau melupakan field wajib email. Di RDBMS, database menolak data yang melanggar constraint. Di MongoDB yang "schemaless", kalian bisa menambahkan aturan yang sama — itulah schema validation.
Episode 8 mengajarkan cara menegakkan integritas data di level database. Roadmap-nya: pertama kita pahami JSON Schema validator dan $jsonSchema, kedua kita bahas validation level strict versus moderate, ketiga validation action error versus warn, keempat kita praktikkan membuat collection dengan validator lengkap, dan terakhir kita pelajari cara mengubah validator pada collection yang sudah ada. Mari mulai.
MongoDB mendukung validasi dokumen berbasis JSON Schema — standar open untuk mendeskripsikan struktur data. Validator didefinisikan saat pembuatan collection dengan opsi validator, dan MongoDB mengeksekusinya pada setiap insert dan update.
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["email", "name"],
properties: {
email: {
bsonType: "string",
pattern: "^.+@.+$"
},
age: {
bsonType: "int",
minimum: 0,
maximum: 150
}
}
}
}
})Perhatikan elemen-elemen validator:
bsonType: "object" — dokumen harus berupa object BSON.required: ["email", "name"] — field wajib yang harus ada.properties — aturan per-field: tipe, pola regex, batas angka.Setelah collection ini dibuat, dokumen tanpa email atau dengan age bertipe string akan ditolak.
JSON Schema menyediakan banyak keyword untuk menegakkan integritas:
| Keyword | Fungsi | Contoh |
|---|---|---|
required | Field wajib | required: ["email", "name"] |
minProperties / maxProperties | Batas jumlah field | maxProperties: 20 |
pattern | Regex untuk string | pattern: "^.+@.+$" |
minLength / maxLength | Panjang string | maxLength: 100 |
minimum / maximum | Batas angka | minimum: 0, maximum: 150 |
enum | Nilai yang diizinkan | enum: ["active", "inactive"] |
additionalProperties: false | Tolak field tak dikenal | additionalProperties: false |
db.createCollection("orders", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["status", "total"],
properties: {
status: {
enum: ["pending", "paid", "shipped", "cancelled"]
},
total: {
bsonType: "decimal",
minimum: 0
},
note: {
bsonType: "string",
maxLength: 500
}
}
}
}
})Validator di atas memastikan status hanya salah satu dari empat nilai yang sah, total harus decimal non-negatif, dan note (jika ada) tidak melebihi 500 karakter.
Level validasi menentukan dokumen apa yang diperiksa:
strict (default) — validator diterapkan ke semua dokumen yang masuk, baik insert maupun update. Artinya, jika kalian meng-update dokumen lama yang tidak sesuai validator, update bisa gagal.moderate — validator hanya diterapkan ke dokumen yang sudah sesuai validator saat pertama kali dimasukkan. Dokumen lama yang melanggar tidak akan dihambat selama di-update. Ini berguna saat ingin menegakkan aturan pada data baru tanpa tersandung data historis yang sudah terlanjur tidak sesuai.db.createCollection("products", {
validationLevel: "moderate",
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name"],
properties: {
name: { bsonType: "string" },
price: { bsonType: "decimal", minimum: 0 }
}
}
}
})Action menentukan apa yang terjadi saat validasi gagal:
error (default) — MongoDB menolak dokumen dan mengembalikan error; insert atau update gagal.warn — MongoDB menyimpan dokumen, tapi menulis pesan peringatan di log. Berguna saat mencoba-coba validator baru tanpa risiko memblokir produksi.db.createCollection("logs", {
validationAction: "warn",
validator: {
$jsonSchema: {
bsonType: "object",
required: ["level", "message"],
properties: {
level: { enum: ["info", "warn", "error"] },
message: { bsonType: "string" }
}
}
}
})Tidak perlu menghapus collection untuk mengganti validator — gunakan perintah collMod (modify collection). Ini pola yang sangat umum di produksi: schema berkembang, dan aturan validasi diperketat bertahap.
db.runCommand({
collMod: "users",
validator: {
$jsonSchema: {
bsonType: "object",
required: ["email", "name", "role"],
properties: {
email: { bsonType: "string", pattern: "^.+@.+$" },
name: { bsonType: "string", maxLength: 80 },
role: { enum: ["student", "mentor", "admin"] },
age: { bsonType: "int", minimum: 0, maximum: 150 }
}
}
},
validationLevel: "moderate"
})Perhatikan: validasi di atas menambahkan role ke daftar wajib dan menetapkan validationLevel: moderate. Dengan moderate, dokumen lama yang tidak punya role tetap bisa di-update tanpa gagal — transisi yang halus alih-alih memblokir data historis.
Warning
Hati-hati dengan additionalProperties: false. Ia membuat MongoDB menolak field baru yang tidak tercantum di validator — kejutan menyakitkan saat aplikasi menambahkan field baru namun lupa memperbarui validator. Untuk schema yang masih berkembang cepat, biarkan default additionalProperties: true dan hanya perketat untuk collection yang benar-benar stabil.
Info
Validasi schema bukan pengganti desain yang baik — ia adalah jaring pengaman yang mewujudkan desain kalian di level database. Kombinasikan dengan validasi di aplikasi (misal library seperti Zod atau Mongoose) untuk pertahanan berlapis: aplikasi menangkap error lebih awal dan ramah pengguna, database menegakkan aturan terakhir yang tak bisa dihindari oleh bug aplikasi.
Pada episode 8 ini kalian telah menegakkan integritas data langsung di database: mendefinisikan aturan dengan $jsonSchema pada saat pembuatan collection — mencakup required, tipe data via bsonType, pola regex pattern, batas angka, dan enum — memahami validation level strict yang memeriksa semua dokumen versus moderate yang menghormati data historis, serta memilih validation action error yang menolak data rusak atau warn yang hanya mencatat peringatan. Kalian juga belajar meng-upgrade validator collection yang ada lewat collMod.
Inti yang harus dibawa pulang:
$jsonSchema validator menegakkan aturan struktur, tipe, dan nilai pada insert/update.strict memeriksa semua dokumen; moderate hanya memeriksa dokumen yang sudah patuh.error memblokir data; warn menerima data dan mencatat peringatan.collMod untuk memperbarui validator tanpa menghapus collection.Di episode 9 berikutnya kita memasuki fase paling menarik: Aggregation Pipeline Fundamentals. Kalian akan memproses data melalui stages bertahap — $match, $project, $group, $sort, $limit, dan $unwind — dan menghitung agregasi seperti $sum, $avg, dan $push untuk menghasilkan insight dari data. Sampai jumpa di episode 9!