2019年3月、MongoDB用の公式の本番環境対応GOドライバーがリリースされ、リリースから継続的に更新されています。このチュートリアルでは、Goドライバーを使用して簡単なMongoDBCRUD操作を実行する方法を学習します。
- Goがマシンにインストールされている必要があります。このチュートリアルでは、Goバージョン1.15を使用します。このリンクからGoパッケージをダウンロードできます。
- 最新バージョンのMongoDBをマシンにインストールし、MongoDBのローカルサーバーを起動します。
MongoDBドライバーのインストール
次のコマンドを実行して、MongoDBgoドライバーをインストールします。
go get go.mongodb.org/mongo-driver
Goモジュールを使用している場合は、go.modファイルを作成すると、上記のコマンドで必要な依存関係がmodファイルに追加されます。このファイルは、すべてのプロジェクト要件を正しいバージョンにロックします。
プロジェクトフォルダにmain.goファイルを作成し、IDEで開きます。 MongoDB操作のコードを作成する前に、必要なすべてのパッケージをファイルにインポートしましょう。
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"
)
次に、すべてのCRUD操作関数で使用する次のグローバル変数を作成します。
var client *mongo.Client
var collection *mongo.Collection
var ctx = context.TODO()
また、ドキュメントタイプの構造を作成します。
type Person struct {
Name string
Age int
City string
}
これで、基本セットアップの準備が整いました。 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
}
この関数は、ローカルで実行されているMongoDBとの接続をセットアップし、クライアントオブジェクトを返します。 connectメソッドがクライアントオブジェクトを返すと、Ping()メソッドを使用して、接続が成功したかどうかを確認できます。 Ping()メソッドがエラーを返した場合は、エラーを発生させて返すことができます。
1つのドキュメントのみを挿入するには、insertOneメソッドを使用でき、複数のドキュメントを一緒に挿入するには、insertManyメソッドを使用できます。 Personコレクションに1つのドキュメントを挿入するための関数は次のとおりです。
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)
}
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)
}
どちらの操作でも、前に作成したPerson構造体を使用し、データで初期化する必要があります。 InsertMany関数を使用すると、すべてのドキュメントのタイプインターフェイスを渡す必要があります。
コレクションからデータを検索するには、パスフィルターが必要になるため、bsonパッケージをインポートしたことを確認してください。 bson.Dタイプを使用して、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)
}
同様に、Findメソッドを使用して、一致するすべてのドキュメントを取得できます。
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())
}
オプションパッケージを使用して、制限や注文などのオプションを指定できます。
FineOneメソッドと同じですが、更新には、bsonフィルターオブジェクトでUpdateOneメソッドを使用することもできます。このコードは、Akashという名前のすべてのドキュメントを更新し、Ageの値を1つ増やします。
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)
}
コレクションからドキュメントを削除するには、DeleteOneメソッドまたはDeleteManyメソッドのいずれかを使用できます。ここでも、bsonフィルターオブジェクトを渡してドキュメントに一致させ、それらを削除することができます。
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)
}
bson.D {{}}オブジェクトをフィルターパラメーターとして渡すと、すべてのドキュメントが削除されます。 collection.Drop()メソッドを使用して、コレクション全体を削除できます。
これらの機能がすべて準備できたら、必要に応じてドライバー機能で使用できます。うまくいけば、これでGoでMongoDB関数を書き始めるのに十分です。詳細については、GoMongoドライバーの公式ドキュメントを参照してください。