Di shell, satu baris perintah langsung dieksekusi — tidak ada tombol undo, tidak ada dialog “yakin?”. Karena itu keamanan data di mongosh ditentukan oleh kebiasaan, bukan oleh fitur. Bab penutup Section ini merangkum kebiasaan-kebiasaan yang membedakan sesi shell yang rapi dari sesi yang berisiko: bekerja di database latihan, mengonfirmasi sebelum mengubah data, menyimpan kode berulang ke file, menjaga kredensial, dan menamai objek secara konsisten.
Selalu Bekerja di Database Latihan #
Perintah apa pun mengarah ke database aktif, dan satu-satunya petunjuk database aktif adalah prompt beserta db.getName(). Karena itu biasakan memeriksa keduanya sebelum menulis, terutama setelah lama meninggalkan terminal:
use latihan_shellOutput yang Dihasilkan:
switched to db latihan_shelldb.getName()Output yang Dihasilkan:
latihan_shellGunakan pola nama latihan_<topik> agar database uji mudah dikenali dari daftar show dbs, dan jangan pernah berlatih di database internal admin, config, atau local.
Konfirmasi Sebelum Mengubah atau Menghapus #
Aturan praktisnya: lihat dulu data yang akan tersentuh, hitung, baru eksekusi. Siapkan collection pesanan berisi empat document:
db.pesanan.insertMany([
{ pembeli: "Budi", status: "dikirim", total: 15000 },
{ pembeli: "Siti", status: "baru", total: 22000 },
{ pembeli: "Dewi", status: "baru", total: 8000 },
{ pembeli: "Budi", status: "selesai", total: 30000 }
])Output yang Dihasilkan:
{
acknowledged: true,
insertedIds: {
'0': ObjectId('6ad3805d8aa601f7909376f7'),
'1': ObjectId('6ad3805d8aa601f7909376f8'),
'2': ObjectId('6ad3805d8aa601f7909376f9'),
'3': ObjectId('6ad3805d8aa601f7909376fa')
}
}Misalkan kita hendak menghapus pesanan berstatus baru. Langkah pertama: pratinjau dengan find() menggunakan filter yang sama persis:
db.pesanan.find({ status: "baru" })Output yang Dihasilkan:
[
{
_id: ObjectId('6ad3805d8aa601f7909376f8'),
pembeli: 'Siti',
status: 'baru',
total: 22000
},
{
_id: ObjectId('6ad3805d8aa601f7909376f9'),
pembeli: 'Dewi',
status: 'baru',
total: 8000
}
]Langkah kedua: pastikan jumlahnya masuk akal dengan countDocuments() memakai filter yang sama:
db.pesanan.countDocuments({ status: "baru" })Output yang Dihasilkan:
2Langkah ketiga: eksekusi deleteMany() dengan filter itu — filter yang sudah dua kali diverifikasi:
db.pesanan.deleteMany({ status: "baru" })Output yang Dihasilkan:
{ acknowledged: true, deletedCount: 2 }Nilai deletedCount: 2 cocok dengan hitungan sebelumnya — tanda filter bekerja seperti dugaan. Verifikasi terakhir memastikan tidak ada sisa:
db.pesanan.find({ status: "baru" }).toArray()Output yang Dihasilkan:
[]Array kosong menandakan tidak ada document berstatus baru lagi. Perhatikan tambahan .toArray() di sini: find() pada hasil kosong tidak mencetak apa-apa di REPL, sehingga bentuk array eksplisit ini memberi kepastian visual saat memverifikasi penghapusan.
Simpan yang Berulang dalam File #
Rangkaian perintah yang diketik berulang kali layak menjadi file. Untuk fungsi bantu yang ingin tersedia di setiap sesi, taruh definisinya di .mongoshrc.js:
// mdtest: skip — isi file ~/.mongoshrc.js
function pesananTerbesar(jumlah = 5) {
return db.pesanan.find().sort({ total: -1 }).limit(jumlah)
}Setelah file itu tersimpan, fungsi pesananTerbesar() bisa dipanggil di sesi mana pun tanpa mengetik ulang. Untuk rangkaian panjang seperti skrip persiapan data, simpan sebagai file JavaScript biasa lalu jalankan dengan mongosh --file — atau muat dari dalam sesi lewat .load, keduanya sudah kita kenal di Chapter Pengenalan mongosh. Pasangan .save bahkan bisa merekam perintah sesi yang sedang berjalan ke file, sehingga eksperimen yang berhasil tinggal disimpan.
Jangan Menaruh Kredensial di Prompt #
Riwayat ketikan REPL tersimpan dan bisa dibuka kembali dengan panah atas — kenyamanan yang berubah menjadi risiko bila yang diketik adalah password. Jangan pernah menuliskan password secara langsung di prompt maupun di connection string yang tertinggal di layar. Gunakan passwordPrompt() agar password dibaca tanpa ditampilkan:
// mdtest: skip — autentikasi dengan password yang disembunyikan
db.auth("budi", passwordPrompt())Saat baris itu dijalankan, shell meminta password secara interaktif dan ketikan tidak tampil di layar maupun riwayat. Pada skrip dan aplikasi, baca kredensial dari environment variable — di konten Course ini nilainya selalu ditulis sebagai penampung seperti YOUR_PASSWORD, bukan nilai asli.
Konvensi Penamaan dan Kerapian #
Konsistensi nama membuat query mudah ditulis dan dibaca. Konvensi yang dipakai di sepanjang Course ini:
| Objek | Konvensi | Contoh |
|---|---|---|
| Database | lowercase, latihan_<topik> untuk uji | latihan_shell, toko_online |
| Collection | lowercase, bentuk jamak | pesanan, produk, pembeli |
| Field | camelCase, bahasa konsisten | namaPembeli, tanggalLahir |
Terakhir, tutup siklus kerja dengan membersihkan database latihan yang sudah tidak dipakai — show dbs yang rampai membuat database uji lama mudah tertukar dengan data penting:
db.dropDatabase()Output yang Dihasilkan:
{ ok: 1, dropped: 'latihan_shell' }Rangkuman #
- Periksa prompt dan
db.getName()sebelum menulis — server tidak pernah meminta konfirmasi ulang. - Sebelum
deleteMany()/updateMany(): pratinjaufind(), hitungcountDocuments(), eksekusi dengan filter yang sama, lalu verifikasi hasil. deleteMany({})menghapus seluruh document pada collection; jangan pernah menjalankannya tanpa sengaja.- Fungsi bantu sering dipakai taruh di
.mongoshrc.js; rangkaian panjang simpan sebagai file dan jalankan--file/.load. - Password tidak pernah diketik langsung — gunakan
passwordPrompt()atau environment variable. - Konsisten menamai: database
latihan_<topik>, collection jamak lowercase, field camelCase; bersihkan database latihan yang selesai dipakai.