Catatan ini berisi penjelasan se-simple mungkin tentang cara membuat CRUD di mongodb dengan repository.

Jika sebelumnya kita membuat koneksi dan query ke database dalam satu fungsi main, pada catatan ini kita akan melakukan beberapa refaktor:

  • model untuk definisi data
  • repository untuk akses data
  • main untuk pemanggilan method

Membuat model

Kita akan menyimpan data dengan struktur seperti ini:

type Book struct {
	ID     primitive.ObjectID `bson:"_id,omitempty"`
	Title  string             `bson:"title,omitempty"`
	Author string             `bson:"author,omitempty"`
	Year   int                `bson:"year_published,omitempty"`
}

Pada kode di atas, kita menggunakan anotasi bson.

Info lanjut mengenai anotasi bson, bisa dilihat di sini: https://www.mongodb.com/blog/post/quick-start-golang–mongodb–modeling-documents-with-go-data-structures

Membuat repository

Repository ini nanti akan kita tempelin fungsi-fungsi crud.

type repository struct {
	collection *mongo.Collection
}

CRUD method

Berikut ini adalah detail fungsi-fungsi CRUD yang menempel pada repository


func (r *repository) createBook(book Book) (*mongo.InsertOneResult, error) {
	return r.collection.InsertOne(context.TODO(), book)
}

func (r *repository) readBook(id interface{}) *mongo.SingleResult {
	filter := bson.M{"_id": id}
	return r.collection.FindOne(context.TODO(), filter)
}

func (r *repository) updateBook(id interface{}, book Book) (*mongo.UpdateResult, error) {
	filter := bson.M{"_id": id}
	update := bson.M{"$set": book}
	return r.collection.UpdateOne(context.TODO(), filter, update)
}

func (r *repository) deleteBook(id interface{}) (*mongo.DeleteResult, error) {
	filter := bson.M{"_id": id}
	return r.collection.DeleteMany(context.TODO(), filter)
}

Repository instance

Setelah itu, bikin satu fungsi untuk membuat instance repository:

func createBookRepository(uri, db, col string) *repository {
	client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))
	if err != nil {
		panic(err)
	}
	return &repository{collection: client.Database(db).Collection(col)}
}

Pada kode di atas, property koleksi coll kita inject dengan instance client yang terhubung dengan server uri, database db, dan koleksi data col.

Variabel-variabel di atas akan kita isi dari fungsi main.

Catatan: perhatikan bahwa return dari fungsi createBookRepository ini berupa pointer sehingga hanya mengembalikan alamat di memori. Baca lagi catatan tentang pointer.

Penggunaan repository

Setelah repository kita buat, kita tinggal panggil method-method yang dibutuhkan.

func main() {
	uri := "mongodb+srv://admin:admin@cluster0.xtwwu.mongodb.net"
	database := "myDB"
	collection := "favorite_books"
	repo := createBookRepository(uri, database, collection)

	result, err := repo.createBook(Book{
		Title:  "Invisible Cities",
		Author: "Italo Calvino",
		Year:   1974,
	})
	if err != nil {
		panic(err)
	}
	fmt.Printf("Inserted document with _id: %v\n", result.InsertedID)
}

Kode selengkapnya: lihat di sini

Jalankan aplikasi

go run main.go

Hasilnya:

Inserted document with _id: ObjectID("61c2a3725e07b8c3ffb1e832")

Praktikum

Clone source code berikut https://github.com/fastrodev/praktikum-repository:

git clone https://github.com/fastrodev/praktikum-repository .

Download modul-modul

go mod tidy

Jalankan aplikasi seperti di atas.