Kalau selama ini kamu terbiasa dengan database relasional seperti MySQL atau PostgreSQL, mungkin kamu bertanya-tanya: kapan sebaiknya memakai database NoSQL? Di tutorial ini kita akan membahas MongoDB — database NoSQL berbasis dokumen yang paling populer — dan cara menggunakannya dari Python lewat library PyMongo. Kamu akan belajar menghubungkan Python ke MongoDB, melakukan operasi CRUD, menulis query lanjutan, membuat index, hingga menjalankan aggregation pipeline, lengkap dengan contoh kode yang bisa langsung kamu jalankan.
Apa Itu MongoDB dan Kapan Menggunakannya?
MongoDB menyimpan data dalam bentuk dokumen BSON (Binary JSON) di dalam collection, bukan tabel dengan baris dan kolom seperti database SQL. Setiap dokumen bisa punya struktur yang berbeda-beda, sehingga skema datanya fleksibel dan mudah berubah seiring berkembangnya aplikasi. Hal ini sangat berguna ketika struktur data kamu belum final atau bervariasi antar entitas.
Perbedaannya dengan database relasional cukup mendasar: di SQL kamu mendesain skema (tabel dan relasi) terlebih dahulu, sedangkan di MongoDB kamu bisa langsung menyimpan data tanpa mendefinisikan skema. Kalau kamu ingin memahami perbandingan mendalam dengan database relasional, kami sudah membahas PostgreSQL dengan Python di artikel terpisah.
MongoDB bukan pengganti database SQL untuk semua kasus. Gunakan MongoDB saat data kamu bersifat semi-terstruktur atau hierarkis (misalnya data produk, profil pengguna, atau log), dan tetap pakai SQL untuk data yang sangat relasional dengan kebutuhan transaksi ketat (ACID).
Persiapan: Menjalankan MongoDB di Komputer Lokal
Cara paling cepat untuk mencoba MongoDB adalah lewat Docker. Jalankan perintah berikut untuk menarik image resmi MongoDB dan menjalankannya sebagai container di port 27017:
docker run -d --name mongodb-lokal -p 27017:27017 mongo:7
Kalau kamu belum familiar dengan Docker, baca dulu Belajar Docker untuk Pemula agar paham konsep container dan port mapping pada perintah di atas.
Selanjutnya, install library PyMongo di environment Python kamu:
pip install pymongo
Menghubungkan Python ke MongoDB dengan PyMongo
Setelah MongoDB berjalan dan PyMongo terinstall, langkah pertama adalah membuat koneksi. PyMongo menggunakan MongoClient untuk terhubung ke server, lalu kita pilih database dan collection yang akan dipakai:
from pymongo import MongoClient
# Hubungkan ke MongoDB yang berjalan di localhost
client = MongoClient("mongodb://localhost:27017/")
# Pilih database (otomatis dibuat jika belum ada)
db = client["toko_online"]
# Pilih collection (setara "tabel" di SQL)
produk = db["produk"]
# Uji koneksi dengan ping
print(client.admin.command("ping")) # {'ok': 1.0}
Operasi CRUD Dasar: Create, Read, Update, Delete
Create: Menyisipkan Dokumen
Di MongoDB, sebuah record disebut dokumen dan direpresentasikan sebagai dictionary Python. Gunakan insert_one() untuk satu dokumen dan insert_many() untuk banyak dokumen sekaligus:
# Menyisipkan satu dokumen
produk.insert_one({
"nama": "Keyboard Mekanik",
"kategori": "aksesoris",
"harga": 750000,
"stok": 25,
"varian": ["merah", "biru"],
})
# Menyisipkan banyak dokumen sekaligus
produk.insert_many([
{"nama": "Mouse Wireless", "kategori": "aksesoris", "harga": 250000, "stok": 50},
{"nama": "Monitor 24 Inch", "kategori": "display", "harga": 1800000, "stok": 12},
{"nama": "Laptop 14 Inch", "kategori": "komputer", "harga": 9500000, "stok": 4},
])
print(produk.count_documents({})) # total dokumen sekarang
Read: Membaca dan Memfilter Data
Untuk membaca data gunakan find() (mengembalikan banyak dokumen) atau find_one() (satu dokumen). Kamu bisa langsung memfilter dengan dictionary sebagai query:
# Mengambil semua dokumen
for p in produk.find():
print(p["nama"], "->", p["harga"])
# Memfilter berdasarkan kategori
for p in produk.find({"kategori": "aksesoris"}):
print(p["nama"], "->", p["harga"])
# Mengambil satu dokumen yang cocok
item = produk.find_one({"nama": "Keyboard Mekanik"})
print(item["harga"])
Update: Mengubah Dokumen
Gunakan update_one() atau update_many() dengan operator seperti $set (mengubah nilai) dan $inc (menambah nilai numerik):
# Mengubah satu field
produk.update_one(
{"nama": "Keyboard Mekanik"},
{"$set": {"harga": 700000}},
)
# Menambah stok (increment)
produk.update_one(
{"nama": "Mouse Wireless"},
{"$inc": {"stok": 10}},
)
print(produk.find_one({"nama": "Mouse Wireless"})["stok"]) # 60
Delete: Menghapus Dokumen
Untuk menghapus data, gunakan delete_one() (satu dokumen) atau delete_many() (semua yang cocok):
# Menghapus satu dokumen
produk.delete_one({"nama": "Monitor 24 Inch"})
# Menghapus semua dokumen dengan stok di bawah 5
produk.delete_many({"stok": {"$lt": 5}})
print(produk.count_documents({}))
Query Lanjutan: Operator Perbandingan dan Logika
MongoDB punya operator query yang mirip dengan klausa WHERE di SQL. Operator perbandingan seperti $gte, $lte, dan $lt, serta operator logika $or dan $and, membuat filter kamu jauh lebih ekspresif:
# Harga antara 500 ribu dan 1 juta
hasil = produk.find({"harga": {"$gte": 500000, "$lte": 1000000}})
# Logika OR: aksesoris ATAU stok di bawah 10
hasil = produk.find({
"$or": [
{"kategori": "aksesoris"},
{"stok": {"$lt": 10}},
]
})
# Sorting dan limit
for p in produk.find().sort("harga", -1).limit(3):
print(p["nama"], "->", p["harga"])
Indexing: Mempercepat Pencarian Data
Saat collection membesar, query tanpa index akan lambat karena MongoDB harus memindai (scan) seluruh dokumen. Index bekerja seperti daftar isi buku — memungkinkan pencarian langsung menuju data yang relevan:
# Index pada satu field (urutan ascending = 1)
produk.create_index("nama")
# Compound index pada beberapa field
produk.create_index([("kategori", 1), ("harga", -1)])
# Melihat semua index di collection
for idx in produk.list_indexes():
print(idx)
Buat index hanya pada field yang sering dipakai di query find() atau sort(). Terlalu banyak index justru memperlambat operasi tulis, karena setiap insert/update harus memperbarui semua index.
Aggregation Pipeline: Analisis Data Seperti GROUP BY
Kalau kamu butuh agregasi — seperti menghitung rata-rata, menjumlahkan, atau mengelompokkan data — gunakan aggregation pipeline. Pipeline terdiri dari serangkaian stage yang memproses dokumen secara berurutan, mirip GROUP BY di SQL:
pipeline = [
# Kelompokkan berdasarkan kategori
{"$group": {
"_id": "$kategori",
"rata_rata_harga": {"$avg": "$harga"},
"total_stok": {"$sum": "$stok"},
"jumlah_produk": {"$sum": 1},
}},
# Urutkan dari rata-rata harga tertinggi
{"$sort": {"rata_rata_harga": -1}},
]
for hasil in produk.aggregate(pipeline):
print(hasil)
Kesimpulan dan Langkah Selanjutnya
Selamat! Kamu sudah menguasai dasar-dasar MongoDB dengan Python: koneksi, CRUD, query lanjutan, indexing, dan aggregation. Dari sini, kamu bisa memakai MongoDB sebagai database utama di proyek nyata — misalnya membangun REST API dengan FastAPI yang menyimpan datanya ke MongoDB. Jangan lupa juga eksplorasi database NoSQL lain seperti Redis yang cocok untuk caching. Selamat ngoding!