Setiap operasi PyMongo berawal dari satu objek: MongoClient. Objek inilah yang mengelola pool koneksi, memilih server, dan menyediakan akses ke database maupun collection — sehingga cara kita membuat dan menutupnya menentukan kesehatan aplikasi. Kebalikan dari intuisi banyak pemula, konstruktor MongoClient sama sekali tidak menyentuh jaringan; koneksi baru benar-benar terjadi ketika operasi pertama dijalankan. Chapter ini membedah perilaku lazy tersebut, dua gaya mengakses database, cara menutup koneksi dengan rapi, dan opsi serverSelectionTimeoutMS yang mengatur kesabaran driver.
Koneksi Pertama dan Perilaku Lazy #
Kita mulai dengan program kecil yang memperlihatkan seluruh siklus dasar: membuat client, memaksa koneksi dengan ping, lalu membaca identitas server. Perhatikan bahwa baris MongoClient(...) selesai dieksekusi dalam hitungan mikrodetik — bukti bahwa tidak ada dialog jaringan di sana.
import os
from pymongo import MongoClient
URI = os.environ.get(
"MONGODB_URI", "mongodb://127.0.0.1:27017/?directConnection=true"
)
# Konstruktor tidak membuka koneksi — perilakunya lazy
client = MongoClient(URI, serverSelectionTimeoutMS=5000)
print("client dibuat, koneksi belum dibuka")
# Operasi pertamalah yang memicu koneksi sungguhan
print("ping :", client.admin.command("ping")["ok"])
print("versi server :", client.server_info()["version"])
print("address :", client.address)
# Dua gaya mengakses database
print("client.toko_buku ->", client.toko_buku.name)
print("client['toko-buku']->", client["toko-buku"].name)
# Collection mengikuti pola yang sama
db = client.toko_buku
print("db['buku'] ->", db["buku"].name)
client.close()Output yang Dihasilkan:
client dibuat, koneksi belum dibuka
ping : 1.0
versi server : 9.0.2
address : ('127.0.0.1', 27017)
client.toko_buku -> toko_buku
client['toko-buku']-> toko-buku
db['buku'] -> bukuMari kita bedah baris-baris pentingnya:
client = MongoClient(URI, ...)— hanya menyiapkan konfigurasi dan thread latar belakang; tidak ada paket yang dikirim. Desain lazy ini membuat urutanimportdan pembuatan client aman diletakkan di mana pun.client.admin.command("ping")["ok"]— perintahpingke databaseadminadalah operasi pertama yang sungguhan, dan di sinilah socket dibuka. Balasan1.0menjadi health check paling ringan yang tersedia.client.server_info()["version"]— meminta ringkasan informasi server; cocok untuk mencatat versi server ke log saat aplikasi start.client.address— alamat server yang dipilih driver, tersedia setelah koneksi terbentuk.client.close()— menutup seluruh pool koneksi milik client ini.
Atribut vs getitem #
Empat baris terakhir berkas tadi memperlihatkan dua gaya akses: client.toko_buku (atribut) dan client["toko-buku"] (getitem). Keduanya menghasilkan objek Database yang identik — pilihan murni soal nyaman dan batas sintaks Python:
| Bentuk nama | Akses yang sah | Catatan |
|---|---|---|
toko_buku | atribut atau getitem | atribut hanya untuk nama pengidentifikasi Python yang sah |
toko-buku | getitem saja | tanda hubung bukan identifier yang sah |
2toko, class, import | getitem saja | diawali angka atau bentrok dengan kata kunci Python |
Karena collection juga mengikuti pola yang sama (db["buku"] versus db.buku), gaya getitem adalah pilihan paling aman untuk nama yang datang dari konfigurasi — misalnya nama database yang dibaca dari environment variable. Prinsip yang perlu diingat: mengakses database atau collection tidak pernah menghubungi server, sama seperti konstruktor MongoClient; keduanya cuma referensi yang baru “hidup” ketika dipakai operasi.
Menutup Koneksi dengan Rapi #
Client yang tidak dipakai lagi harus ditutup agar socket dan thread tidak menumpuk. PyMongo menyediakan dua cara: statement with yang menutup otomatis saat blok selesai, atau client.close() secara eksplisit.
import os
from pymongo import MongoClient
URI = os.environ.get(
"MONGODB_URI", "mongodb://127.0.0.1:27017/?directConnection=true"
)
# with menutup koneksi otomatis saat blok selesai
with MongoClient(URI, serverSelectionTimeoutMS=5000) as client:
print("ping dalam with:", client.admin.command("ping")["ok"])
print("blok with selesai, koneksi ditutup otomatis")
# Penutupan eksplisit juga sah
client2 = MongoClient(URI, serverSelectionTimeoutMS=5000)
print("ping client2 :", client2.admin.command("ping")["ok"])
client2.close()
try:
client2.admin.command("ping")
except Exception as err:
print("setelah close():", type(err).__name__, "-", err)Output yang Dihasilkan:
ping dalam with: 1.0
blok with selesai, koneksi ditutup otomatis
ping client2 : 1.0
setelah close(): InvalidOperation - Cannot use MongoClient after closeDua fakta terbaca dari output itu. Pertama, with menjamin penutupan meskipun terjadi exception di tengah blok — pola yang tepat untuk skrip pendek dan batch job. Kedua, client yang sudah ditutup menolak operasi baru dengan InvalidOperation; pesan Cannot use MongoClient after close muncul jelas, bukan error samar di thread latar.
Opsi serverSelectionTimeoutMS #
Ketika operasi pertama dijalankan, driver harus memilih satu server yang cocok dari topology yang dikenalnya. Berapa lama driver boleh menunggu diatur oleh serverSelectionTimeoutMS — defaultnya 30.000 milidetik. Bila batas waktu terlampaui (server mati, alamat salah), operasi gagal dengan exception ServerSelectionTimeoutError yang kita bedah di Chapter Error Handling.
# sebagai argumen konstruktor
client = MongoClient(URI, serverSelectionTimeoutMS=3000)
# atau sebagai parameter di connection string
uri = "mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=3000"
client = MongoClient(uri)Untuk skrip CLI, nilai 3–5 detik biasanya pas: gagal cepat, pengguna langsung tahu server tidak tersedia. Untuk layanan backend yang panjang umur, nilai default 30 detik memberi ruang bagi failover replica set — primary baru punya waktu untuk terpilih tanpa membuat aplikasi langsung melaporkan kegagalan.
Rangkuman #
MongoClient(...)bersifat lazy: tidak membuka koneksi; operasi pertama sepertipingyang memicunya.client.admin.command("ping")["ok"]adalah health check paling ringan;client.addressdanserver_info()melengkapi identitas server.client.toko_bukudanclient["toko-buku"]setara; getitem wajib untuk nama dengan tanda hubung, diawali angka, atau bentrok kata kunci.- Tutup client lewat
with(otomatis) atauclose(); client yang sudah ditutup menolak operasi denganInvalidOperation. - Satu client per proses — jangan satu client per request; atur
serverSelectionTimeoutMSsesuai karakter aplikasi.
Koneksi terbuka dan tertutup dengan rapi. Chapter berikutnya mengisi database toko buku kita dengan operasi CRUD lengkap dari Python.