Sejauh ini document yang gagal validasi selalu ditolak dengan error. Opsi validationAction menawarkan pilihan lain: terima document bermasalah, tetapi catat pelanggarannya di log server. Kedua mode ini — error dan warn — berguna di fase yang berbeda: warn adalah alat pengintaian sebelum penolakan benar-benar dinyalakan.
Menolak atau Mencatat #
| Mode | Document yang gagal validasi | Kapan dipakai |
|---|---|---|
error (default) | Ditolak, operasi gagal | Perlindungan aktif sehari-hari |
warn | Diterima, pelanggaran dicatat di log mongod | Mengamati pelanggaran sebelum mengaktifkan penolakan |
Skenario khasnya begini: kita ingin memasang validator baru pada collection produksi, tetapi tidak tahu berapa banyak penulis data yang akan tersandung aturan baru. Menyalakan error langsung bisa memutus aliran transaksi. Dengan warn, semua insert tetap lancar sementara log mengumpulkan daftar pelanggaran — bahan untuk memperbaiki aplikasi atau melonggarkan aturan sebelum beralih ke error.
Mode warn di Praktik #
Kita pasang validator dengan validationAction: "warn" pada collection produk:
use latihan_validasi
db.produk.drop()
db.createCollection("produk", { validator: { $jsonSchema: {
bsonType: "object",
required: ["nama", "harga"],
properties: {
nama: { bsonType: "string" },
harga: { bsonType: "number", minimum: 0 }
}
} }, validationAction: "warn" })
db.getCollectionInfos({ name: "produk" })[0].optionsOutput yang Dihasilkan:
switched to db latihan_validasi
true
{ ok: 1 }
{
validator: {
'$jsonSchema': {
bsonType: 'object',
required: [ 'nama', 'harga' ],
properties: {
nama: { bsonType: 'string' },
harga: { bsonType: 'number', minimum: 0 }
}
}
},
validationAction: 'warn'
}Metadata collection mencatat validationAction: 'warn'. Sekarang kirim document yang jelas-jelas melanggar — field harga salah ketik:
db.produk.insertOne({ nama: "Gula Pasir 1kg", hrga: 15000 })
db.produk.find()Output yang Dihasilkan:
{
acknowledged: true,
insertedId: ObjectId('6ad39172999b716fa7999b4d')
}
[
{
_id: ObjectId('6ad39172999b716fa7999b4d'),
nama: 'Gula Pasir 1kg',
hrga: 15000
}
]Insert berhasil — acknowledged: true — dan find() memperlihatkan document bermasalah itu benar-benar tersimpan. Tidak ada error apa pun di mongosh; catatannya berada di tempat lain.
Membaca Pelanggaran di Log Server #
Setiap pelanggaran mode warn ditulis ke log mongod sebagai entri level warning. Kita bisa membacanya lewat db.adminCommand({ getLog: "global" }) — buffer log terkini — lalu menyaring baris yang memuat pesan Document would fail validation:
const baris = db.adminCommand({ getLog: "global" }).log.filter(l => l.includes("Document would fail validation")).pop()
baris.slice(baris.indexOf('"s"'), baris.indexOf('"s"') + 300)Output yang Dihasilkan:
"s":"W", "c":"STORAGE", "id":20294, "ctx":"conn3055","msg":"Document would fail validation","attr":{"namespace":"latihan_validasi.produk","document":{"_id":{"$oid":"6ad39172999b716fa7999b4d"},"nama":"Gula Pasir 1kg","hrga":15000},"errInfo":{"failingDocumentId":{"$oid":"6ad39172999b716fa7999b4d"}Mari kita baca potongan baris log tersebut:
"s":"W"— severity warning;"c":"STORAGE"komponen yang menulisnya."msg":"Document would fail validation"— pesan tetap untuk setiap pelanggaran modewarn."attr":{"namespace":"latihan_validasi.produk2", ...}— collection tempat pelanggaran terjadi, berikut document lengkap danerrInfoyang isinya sama dengan detail galat modeerror.
Di produksi, tempat membacanya adalah berkas log mongod (misalnya /var/log/mongodb/mongod.log) atau dashboard monitoring yang menyerap log tersebut — bukan perintah getLog manual. Yang penting: pelanggaran tidak menghilang, semuanya tercatat.
Kembali ke Mode error #
Setelah daftar pelanggaran dianalisis, satu collMod cukup untuk menyalakan penolakan:
db.runCommand({ collMod: "produk", validationAction: "error" }).ok
db.produk.insertOne({ nama: "Teh Melati 100g", hrga: 15000 })Output yang Dihasilkan:
1
Uncaught:
MongoServerError: Document failed validation
Additional information: {
failingDocumentId: ObjectId('6ad39172999b716fa7999b4e'),
details: {
operatorName: '$jsonSchema',
schemaRulesNotSatisfied: [
{
operatorName: 'required',
specifiedAs: { required: [ 'nama', 'harga' ] },
missingProperties: [ 'harga' ]
}
]
}
}Validator yang sama, collection yang sama — kini document bermasalah ditolak seperti biasa. Bersihkan database latihan:
db.dropDatabase()Output yang Dihasilkan:
{ ok: 1, dropped: 'latihan_validasi' }Rangkuman #
validationAction: "error"(default) menolak document yang gagal validasi;"warn"menerimanya dan mencatat pelanggaran di log mongod.- Entri log mode
warnmemuat namespace, document lengkap, danerrInfo— bahan lengkap untuk menganalisis pelanggaran. - Pola aman: nyalakan validator dengan
warnlebih dulu, kumpulkan pelanggaran, perbaiki penulis data atau longgarkan aturan, lalu beralih keerror. collModdapat menggantivalidationActionkapan saja tanpa menulis ulang validator.
validationLevel dan validationAction lengkap sudah di tangan. Chapter penutup merangkai semuanya menjadi strategi jangka panjang: mengubah bentuk document dari waktu ke waktu tanpa migrasi besar-besaran.