Menggunakan MongoDB pada GOLANG
Kali ini akan membahas MongoDB, tekniknya hampir sama dengan Menghubungkan Mysql dengan Golang. Pertama-tama, Kita perlu men-download driver menggunakan go get.
go get go.mongodb.org/mongo-driver/mongo
Asumsi instalasi MongoDB Anda menggunakan setting default, maka metode pengaturannya akan seperti ini:
package main
import (
"context"
"log"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
func GetClient() *mongo.Client {
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.NewClient(clientOptions)
if err != nil {
log.Fatal(err)
}
err = client.Connect(context.Background())
if err != nil {
log.Fatal(err)
}
return client
}
Untuk test koneksi ke mongoDB, kita dapat memanggil fungsi PING, dan memeriksa apakah mengembalikan response error. Jika tidak, koneksi berhasil.
func main() {
c := GetClient()
err := c.Ping(context.Background(), readpref.Primary())
if err != nil {
log.Fatal("Couldn't connect to the database", err)
} else {
log.Println("Connected!")
}
}
Dan sekarang untuk contoh selanjutnya kita akan membuat database dengan nama test dan sebuah collection di dalam database itu dengan sebutan heroes:
{
"_id" : ObjectId("5d0574824d9f7ff15e989171"),
"name" : "Tony Stark",
"alias" : "Iron Man",
"signed" : true
}
{
"_id" : ObjectId("5d0574d74d9f7ff15e989172"),
"name" : "Steve Rodgers",
"alias" : "Captain America",
"signed" : false
}
{
"_id" : ObjectId("5d0574e94d9f7ff15e989173"),
"name" : "Vision",
"alias" : "Vision",
"signed" : true
}
{
"_id" : ObjectId("5d0575344d9f7ff15e989174"),
"name" : "Clint Barton",
"alias" : "Hawkeye",
"signed" : false
}
Untuk menggunakan dengan dokumen-dokumen ini, akan lebih baik jika kita membuat struct yang mewakili semua Fields dan nama json-nya.
type Hero struct {
Name string `json:"name"`
Alias string `json:"alias"`
Signed bool `json:"signed"`
}
Sekarang mari kita buat Metode yang akan mengembalikan data semua Heroes dengan request 2 parameter: Client MongoDB dan bson.M yang mewakili filter. jika filter ini kosong, metode ini akan return semua dokumen.
import (
"context"
"log"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
func ReturnAllHeroes(client *mongo.Client, filter bson.M) []*Hero {
var heroes []*Hero
collection := client.Database("test").Collection("heroes")
cur, err := collection.Find(context.TODO(), filter)
if err != nil {
log.Fatal("Error on Finding all the documents", err)
}
for cur.Next(context.TODO()) {
var hero Hero
err = cur.Decode(&hero)
if err != nil {
log.Fatal("Error on Decoding the document", err)
}
heroes = append(heroes, &hero)
}
return heroes
}
Rinciannya adalah:
- Buat collection yang mewakili collection dalam database;
- Minta collection untuk return kursor dengan elemen berdasarkan filter (dalam hal ini filter kosong, sehingga akan mengembalikan semua elemen);
- Iterasi kursor ini dan Dekode setiap dokumen ke tipe Heroes;
- Tambahkan Hero yang di decode ke dalam array Heroes.
Jika kita run di dalam fungsi utama, return-nya kita adalah:
heroes := ReturnAllHeroes(c, bson.M{})
for _, hero := range heroes {
log.Println(hero.Name, hero.Alias, hero.Signed)
}
2019/06/15 21:07:00 Tony Stark Iron Man true
2019/06/15 21:07:00 Steve Rodgers Captain America false
2019/06/15 21:07:00 Vision Vision true
2019/06/15 21:07:00 Clint Barton Hawkeye false
Untuk retrieve hanya Heroes yang menandatangani Sokovia Accords, kita hanya perlu mengubah filter.
heroes := ReturnAllHeroes(c, bson.M{"signed": true})
2019/06/15 21:18:04 Tony Stark Iron Man true
2019/06/15 21:18:04 Vision Vision true
Untuk mengambil hanya satu Hero, metode baru kami akan seperti ini:
func ReturnOneHero(client *mongo.Client, filter bson.M) Hero {
var hero Hero
collection := client.Database("test").Collection("heroes")
documentReturned := collection.FindOne(context.TODO(), filter)
documentReturned.Decode(&hero)
return hero
}
Memanggilnya:
hero := ReturnOneHero(c, bson.M{"name": "Vision"})
log.Println(hero.Name, hero.Alias, hero.Signed)
2019/06/15 22:55:44 Vision Vision true
Sekarang, untuk menambah Heroes collection dan menyisipkan, misalnya Doctor Strange: Buat Metode baru dengan seperti ini:
func InsertNewHero(client *mongo.Client, hero Hero) interface{} {
collection := client.Database("civilact").Collection("heroes")
insertResult, err := collection.InsertOne(context.TODO(), hero)
if err != nil {
log.Fatalln("Error on inserting new Hero", err)
}
return insertResult.InsertedID
}
Begitulah cara kita menggunalan metode tersebut dan di check dengan metode kami, sebelum menjalankan metode ReturnOneHero:
hero = Hero{Name: "Stephen Strange", Alias: "Doctor Strange", Signed: true}
insertedID := InsertNewHero(c, hero)
log.Println(insertedID)
hero = ReturnOneHero(c, bson.M{"alias": "Doctor Strange"})
log.Println(hero.Name, hero.Alias, hero.Signed)
Bagus! Kita menambahkan data Sorcerer Supreme dalam Heroes collection kami, tetapi bagaimana jika meminta kita untuk menghapus datanya? Nah, itu sebabnya kita membutuhkan metode RemoveOneHero.
func RemoveOneHero(client *mongo.Client, filter bson.M) int64 {
collection := client.Database("test").Collection("heroes")
deleteResult, err := collection.DeleteOne(context.TODO(), filter)
if err != nil {
log.Fatal("Error on deleting one Hero", err)
}
return deleteResult.DeletedCount
}
Dan:
heroesRemoved := RemoveOneHero(c, bson.M{"alias": "Doctor Strange"})
log.Println("Heroes removed count:", heroesRemove
hero = ReturnOneHero(c, bson.M{"alias": "Doctor Strange"})
log.Println("Is Hero empty?", hero == Hero{ })
Untuk yang terakhir, mari kita bayangkan Hawkeye berubah pikiran dan sekarang ingin menandatangani Accords. Jadi mari kita buat metode UpdateHero.
func UpdateHero(client *mongo.Client, updatedData bson.M, filter bson.M) int64 {
collection := client.Database("test").Collection("heroes")
atualizacao := bson.D{ {Key: "$set", Value: updatedData} }
updatedResult, err := collection.UpdateOne(context.TODO(), filter, atualizacao)
if err != nil {
log.Fatal("Error on updating one Hero", err)
}
return updatedResult.ModifiedCount
}
Itu dia! Operasi CRUD sederhana menggunakan mongodb dan golang.
Conclusion
Dalam tutorial ini, kita berhasil mengatur koneksi ke Mongodb dan kemudian melakukan beberapa metode sederhana ke database dan mengambil data dari collection yang retrieve ke dalam sebuah struct atau array dari struct. Mudah-mudahan ini akan memberi Anda semua yang Anda butuhkan untuk mengambil langkah lebih lanjut dan membangun aplikasi Go Anda sendiri di atas Mongodb.