Pada bulan Maret 2019, driver GO resmi yang siap produksi untuk MongoDB telah dirilis dan telah menerima pembaruan berkelanjutan sejak peluncurannya. Dalam tutorial ini, kita akan belajar melakukan operasi CRUD MongoDB sederhana menggunakan driver Go.
Prasyarat
Ada dua hal yang diperlukan sebelum kita memulai tutorial ini.
- Go harus diinstal pada mesin Anda. Go versi 1.15 digunakan untuk tutorial ini. Anda dapat mengunduh paket Go dari tautan ini.
- Instal versi terbaru MongoDB di komputer Anda dan mulai server lokal MongoDB.
Instalasi Driver MongoDB
Instal driver MongoDB go dengan menjalankan perintah berikut:
go get go.mongodb.org/mongo-driver
Jika Anda menggunakan Modul Go, buat file go.mod dan perintah di atas akan menambahkan ketergantungan yang diperlukan dalam file mod. File ini mengunci semua persyaratan proyek ke versi yang benar.
Menyiapkan File Utama
Buat file main.go di folder proyek Anda dan buka di IDE Anda. Sebelum kita menulis kode untuk operasi MongoDB, mari impor semua paket yang diperlukan ke dalam file.
package main
import (
"context"
"fmt"
"log"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
Sekarang, Buat variabel global berikut yang akan kita gunakan di semua fungsi operasi CRUD.
var client *mongo.Client
var collection *mongo.Collection
var ctx = context.TODO()
Juga, buat struktur untuk jenis dokumen.
type Person struct {
Name string
Age int
City string
}
Menghubungkan ke MongoDB
Sekarang pengaturan dasar sudah siap. Mari kita buat fungsi pertama kita untuk menghubungkan ke MongoDB.
func connect() *mongo.Client {
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.Connect(ctx, clientOptions)
if err != nil {
log.Fatal(err)
}
err = client.Ping(ctx, nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to MongoDB!")
return client
}
Fungsi ini akan mengatur koneksi dengan MongoDB yang berjalan secara lokal dan mengembalikan objek klien. Setelah metode connect mengembalikan objek klien, kita dapat menggunakan metode Ping() untuk memeriksa apakah koneksi berhasil atau tidak. Jika metode Ping() mengembalikan kesalahan apa pun, kami dapat meningkatkan kesalahan dan mengembalikannya.
Operasi Sisipkan
Untuk menyisipkan hanya satu dokumen, kita dapat menggunakan metode insertOne dan untuk menyisipkan beberapa dokumen secara bersamaan, kita dapat menggunakan metode insertMany. Berikut ini adalah fungsi untuk memasukkan satu dokumen ke dalam koleksi Person:
func insertOne() {
akash := Person{"Akash", 28, "Bengaluru"}
res, err := collection. InsertOne (ctx, akash)
if err != nil {
log.Fatal(err)
}
fmt.Println("Inserted document: ", res.InsertedID)
}
Berikut adalah fungsi untuk menambahkan beberapa dokumen ke koleksi:
func insertMany() {
akash := Person{"Akash", 28, "Bengaluru"}
bob := Person {"Bob", 30, "New York"}
robin := Person {"Robin", 25, "London"}
persons := []interface{}{akash, bob, robin}
res, err := collection.InsertMany(ctx, persons)
if err != nil {
log.Fatal(err)
}
fmt.Println("Inserted documents: ", res.InsertedIDs)
}
Untuk kedua operasi, kita perlu menggunakan struct Person yang kita buat sebelumnya dan menginisialisasinya dengan data kita. Dengan fungsi InsertMany, kita harus melewati antarmuka tipe untuk semua dokumen.
Operasi Pengambilan
Untuk menemukan data dari koleksi, kami akan memerlukan pass filter jadi pastikan Anda telah mengimpor paket bson. Kami akan menggunakan tipe bson.D untuk membuat filter menggunakan objek bson.
func retrieveOne() {
var result Person
filter := bson.D{{"name", "Akash"}}
err := collection.FindOne(ctx, filter).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Found a single document: %+v\n", result)
}
Dengan cara yang sama, kita dapat menggunakan metode Temukan untuk mengambil semua dokumen yang cocok.
func retrieveAll() {
findOptions := options.Find()
findOptions.SetLimit(2)
var results []*Person
cur, err := collection.Find(ctx, bson.D{{}}, findOptions)
if err != nil {
log.Fatal(err)
}
// Loop through the cursor
for cur.Next(context.TODO()) {
var elem Person
err := cur.Decode(&elem)
if err != nil {
log.Fatal(err)
}
results = append(results, &elem)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
cur.Close(context.TODO())
}
Anda dapat menggunakan paket opsi untuk menentukan opsi seperti batas atau pesanan.
Operasi Pembaruan
Sama seperti metode FineOne, untuk update juga bisa menggunakan metode UpdateOne dengan objek filter bson. Kode ini akan memperbarui semua dokumen dengan nama Akash dan meningkatkan nilai Age sebanyak satu.
func update() {
filter := bson.D{{"name", "Akash"}}
update := bson.D{
{"$inc", bson.D{
{"Age", 1},
}},
}
updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Updated documents: %+v\n", updateResult)
}
Operasi Hapus
Untuk menghapus dokumen dari koleksi apa pun, Anda dapat menggunakan metode DeleteOne atau DeleteMany. Di sini juga, kita dapat melewatkan objek filter bson untuk mencocokkan dokumen dan menghapusnya.
func delete() {
deleteResult, err := collection.DeleteMany(ctx, bson.D{{}})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult.DeletedCount)
}
Jika Anda meneruskan objek bson.D{}} sebagai parameter filter, maka semua dokumen akan dihapus. Anda dapat menggunakan metode collection.Drop() untuk menghapus seluruh koleksi.
Setelah semua fungsi ini siap, Anda dapat menggunakannya dalam fungsi driver Anda sesuai dengan kebutuhan Anda. Mudah-mudahan, ini cukup untuk membantu Anda mulai menulis fungsi MongoDB di Go. Untuk informasi lebih lanjut, Anda dapat merujuk ke dokumentasi resmi untuk driver Go Mongo.