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.