← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 52

NoSQL MongoDB

Simpan dokumen JSON-style dengan driver Mongo.

Pahami konsepnya

MongoDB adalah database dokumen: satu baris = satu dokumen BSON yang bentuknya mirip JSON dengan field bebas, cocok untuk data yang skemanya berkembang. Driver resminya go.mongodb.org/mongo-driver — koneksi lewat mongo.Connect(client.Options{ApplyURI(...)}), lalu collection diambil dari database dengan mongoClient.Database("nama").Collection("nama").

Operasi dasar: InsertOne/InsertMany menulis dokumen; FindOne dengan bson.M{"nama": nilai} mengambil satu; Find mengembalikan cursor yang disusuri seperti rows SQL (cursor.Next + cursor.Decode). UpdateOne mengubah field dengan operator $set; DeleteOne menghapus.

Filter ditulis dengan tipe bson.M — map bebas kunci-nilai yang diterjemahkan ke BSON: bson.M{"umur": bson.M{"$gte": 18}} berarti umur >= 18. Kontras dengan SQL: tak ada skema tabel yang harus cocok; dokumen dalam satu koleksi boleh berbeda bentuk, dan struct Go tetap bisa menampilkannya lewat tag bson:"nama" mirip json.

Coba contoh kode

package main

import (
    "context"
    "fmt"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

type Siswa struct {
    Nama string `bson:"nama"`
    Poin int    `bson:"poin"`
}

func main() {
    klien, _ := mongo.Connect(context.TODO(),
        options.Client().ApplyURI("mongodb://localhost:27017"))
    kol := klien.Database("sekolah").Collection("siswa")

    kol.InsertOne(context.TODO(), Siswa{Nama: "Ari", Poin: 95})

    var hasil Siswa
    kol.FindOne(context.TODO(), bson.M{"nama": "Ari"}).Decode(&hasil)
    fmt.Println(hasil.Nama, hasil.Poin)
}

Koneksi memakai URI standar mongodb://host:port; collection diambil tanpa migrasi — database dan koleksi dibuat otomatis saat pertama diisi. FindOne menerima filter bson.M lalu Decode mengisi struct lewat tag bson. Context TODO di contoh; di produksi gunakan context dengan timeout.

Filter operator dan update

// cari semua siswa berpoin >= 80, urut turun
cursor, _ := kol.Find(ctx, bson.M{"poin": bson.M{"$gte": 80}},
    options.Find().SetSort(bson.D{{Key: "poin", Value: -1}}))

var semua []Siswa
cursor.All(ctx, &semua)

// naikkan poin Ari sebanyak 5
kol.UpdateOne(ctx,
    bson.M{"nama": "Ari"},
    bson.M{"$inc": bson.M{"poin": 5}})

bson.M bersarang menyusun operator ($gte, $in, $regex) seperti klausa WHERE yang dirakit dari potongan. SetSort mengatur urutan, cursor.All mengumpulkan seluruh hasil sekaligus, dan $inc menaikkan nilai tanpa membaca-dulu-menulis-belakangan — operasi atomik di server.