MongoDB Go Driver Tutorial

UPD: tutorial telah diperbarui sehubungan dengan rilis versi rilis.


Kabar baik! Driver go resmi untuk mongoDB telah dirilis.
Dengan sedikit pemikiran, saya memutuskan untuk menerjemahkan artikel dari situs mongoDB resmi daripada menulis sendiri (terjemahan ini berbeda dari artikel).
Inilah yang akan ada dalam tutorial ini:


  • Instal mongo-go-driver
  • Terhubung ke mongoDB menggunakan mongo-go-driver
  • Menggunakan objek BSON
  • Menggunakan Metode CRUD

gambar


Kode asli dapat ditemukan dalam dokumentasi resmi .
Untuk menggunakan panduan ini, Anda harus menginstal versi MongoDB tidak kurang dari 2.6 dan Golang 1.10 atau lebih baru.


Instal mongo-go-driver


Disarankan agar Anda menginstal driver menggunakan dep (tentu saja, jika Anda masih belum beralih ke modul):


dep ensure -add "go.mongodb.org/mongo-driver/mongo@~1.0.0" 

Pembuatan fondasi


Buat proyek dan tambahkan file main.go dengan konten berikut:


 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" "go.mongodb.org/mongo-driver/mongo/readpref" ) // You will be using this Trainer type later in the program type Trainer struct { Name string Age int City string } func main() { // Rest of the code will go here } 

Dalam kode ini, kita mengimpor mongo-go-driver, beberapa pustaka standar, dan mendefinisikan tipe Trainer.


Terhubung ke mongoDB menggunakan mongo-go-driver


Setelah kami mengimpor mongo-go-driver, kami mendapat kesempatan untuk membuat koneksi dengan mongoDB menggunakan fungsi mongo.NewClient () . Kami memiliki kesempatan untuk beralih ke fungsi ini sebagai argumen konteks dan baris yang berisi alamat koneksi ke mongodb. Jika diinginkan, kita juga bisa meneruskan objek options.ClientOptions sebagai argumen ketiga untuk menyempurnakan pengaturan driver.
Dokumentasi merinci opsi yang tersedia.


Mari kita tambahkan kode berikut ke badan fungsi utama:


 // Create client client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://127.0.0.1:27017")) if err != nil { log.Fatal(err) } // Create connect err = client.Connect(context.TODO()) if err != nil { log.Fatal(err) } // Check the connection err = client.Ping(context.TODO(), nil) if err != nil { log.Fatal(err) } fmt.Println("Connected to MongoDB!") 

Setelah berhasil terhubung ke mongoDB, kita dapat mengakses koleksi pelatih , yang terletak di database yang disebut tes dengan menambahkan kode berikut ke akhir fungsi utama:


 collection := client.Database("test").Collection("trainers") 

Disarankan agar Anda menjaga koneksi dengan mongoDB terbuka sehingga Anda tidak perlu membuka dan menutup koneksi untuk setiap permintaan. Namun, jika aplikasi tidak lagi memerlukan koneksi, itu dapat ditutup menggunakan fungsi client.Disconnect () sebagai berikut:


 err = client.Disconnect(context.TODO()) if err != nil { log.Fatal(err) } fmt.Println("Connection to MongoDB closed.") 

Komentari paket yang tidak digunakan.


Jalankan kode kami ( pergi jalankan main.go ) untuk memeriksa koneksi ke server mongoDB.


Menggunakan objek BSON


Dokumen JSON dalam mongoDB disimpan dalam format biner yang disebut BSON. Tidak seperti database lain di mana data JSON disimpan dalam bentuk string dan angka, pengkodean BSON menambahkan tipe baru, seperti int , long , date , float , dan desimal128 .


Ini sangat menyederhanakan pemrosesan, pengurutan dan perbandingan data dengan aplikasi. Pengemudi Go memiliki dua tipe keluarga untuk mewakili data BSON: tipe D dan tipe RAW.


Family D terdiri dari empat jenis:


  • D : dokumen BSON. Jenis ini harus digunakan dalam situasi di mana ketertiban penting, misalnya, perintah MongoDB.
  • M : Kamus tidak berurutan (array asosiatif, peta). Itu sama dengan D , kecuali itu tidak menjaga ketertiban.
  • A : array BSON.
  • E : elemen tunggal di dalam D.

Berikut adalah contoh filter yang dibuat menggunakan tipe-D yang mencari dokumen di mana bidang nama cocok dengan nilai-nilai Alice atau Bob :


Keluarga tipe Raw digunakan untuk memeriksa byte slicing. Anda dapat mengekstraksi elemen tunggal dari tipe Raw menggunakan Lookup () .


Ini bisa berguna ketika Anda harus menyingkirkan beban tambahan saat mengkonversi BSON ke tipe lain.
Hanya keluarga tipe-D yang akan digunakan dalam tutorial ini.


Menggunakan Metode CRUD


Setelah berhasil terhubung ke database, kita dapat mulai menambah dan memodifikasi data dalam koleksi kami.
Jenis Koleksi berisi metode yang memungkinkan Anda mengirim pertanyaan ke database.


Penyisipan (pembuatan) dokumen


Pertama, Anda perlu membuat beberapa struktur Pelatih baru untuk dimasukkan ke dalam basis data:


 ash := Trainer{"Ash", 10, "Pallet Town"} misty := Trainer{"Misty", 10, "Cerulean City"} brock := Trainer{"Brock", 15, "Pewter City"} 

Untuk menyematkan satu dokumen, gunakan metode collection.InsertOne () :


 insertResult, err := collection.InsertOne(context.TODO(), ash) if err != nil { log.Fatal(err) } fmt.Println("Inserted a single document: ", insertResult.InsertedID) 

Untuk memasukkan banyak dokumen secara bersamaan, ada metode collection.InsertMany () :


 trainers := []interface{}{misty, brock} insertManyResult, err := collection.InsertMany(context.TODO(), trainers) if err != nil { log.Fatal(err) } fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs) 

Pembaruan Dokumen


Metode collection.UpdateOne () memungkinkan Anda memperbarui satu dokumen. Anda perlu membuat filter untuk mencari dokumen di database dan dokumen untuk operasi pembaruan. Anda dapat membuatnya menggunakan tipe bson.D :


 filter := bson.D{{"name", "Ash"}} update := bson.D{ {"$inc", bson.D{ {"age", 1}, }}, } 

Kode berikut akan menemukan dokumen di mana bidang nama cocok dengan nilai Ash dan meningkatkan nilai usia 1.


 updateResult, err := collection.UpdateOne(context.TODO(), filter, update) if err != nil { log.Fatal(err) } fmt.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount) 

Pencarian Dokumen


Untuk menemukan dokumen, Anda akan memerlukan filter, serta pointer ke variabel yang hasilnya dapat diterjemahkan.


Untuk menemukan satu dokumen, gunakan collection.FindOne () . Metode ini mengembalikan nilai tunggal yang dapat diterjemahkan ke dalam variabel.


Kami akan menggunakan variabel filter yang sama yang digunakan dalam permintaan pembaruan.


 // create a value into which the result can be decoded var result Trainer err = collection.FindOne(context.TODO(), filter).Decode(&result) if err != nil { log.Fatal(err) } fmt.Printf("Found a single document: %+v\n", result) 

Untuk menemukan banyak dokumen, gunakan collection.Find () .


Metode ini mengembalikan kursor . Kursor menyediakan aliran dokumen yang dapat Anda gunakan untuk mengulangi dan mendekode dokumen satu per satu.


Ketika dokumen dalam kursor habis, Anda harus menutup kursor . Anda juga dapat menyempurnakan Kursor menggunakan paket opsi .


Dalam contoh kami, kami menetapkan batas pada penerbitan dua dokumen.


 // Pass these options to the Find method options := options.Find() options.SetLimit(2) filter := bson.M{} // Here's an array in which you can store the decoded documents var results []*Trainer // Passing nil as the filter matches all documents in the collection cur, err := collection.Find(context.TODO(), filter, options) if err != nil { log.Fatal(err) } // Finding multiple documents returns a cursor // Iterating through the cursor allows us to decode documents one at a time for cur.Next(context.TODO()) { // create a value into which the single document can be decoded var elem Trainer err := cur.Decode(&elem) if err != nil { log.Fatal(err) } results = append(results, &elem) } if err := cur.Err(); err != nil { log.Fatal(err) } // Close the cursor once finished cur.Close(context.TODO()) fmt.Printf("Found multiple documents (array of pointers): %+v\n", results) 

Hapus dokumen


Anda dapat menghapus dokumen menggunakan collection.DeleteOne () atau collection.DeleteMany () . Kami memberikan nil sebagai argumen filter, yang akan cocok dengan semua dokumen dalam koleksi. Anda juga dapat menggunakan collection.Drop () untuk menghapus seluruh koleksi.


 filter := bson.M{} deleteResult, err := collection.DeleteMany(context.TODO(), filter) if err != nil { log.Fatal(err) } fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult.DeletedCount) 

Langkah selanjutnya


→ Kode terakhir untuk tutorial ini ada di repositori GitHub
Dokumentasi driver tersedia di GoDoc


Jika Anda memiliki pertanyaan, silakan hubungi kami di google group mongo-go-driver .
Silakan kirim laporan bug ke MongoDB JIRA .
Kami akan dengan senang hati menerima tanggapan Anda tentang Go Driver.

Source: https://habr.com/ru/post/id433776/


All Articles