sql >> データベース >  >> NoSQL >> MongoDB

MongoDBGoドライバー入門

    2019年3月、MongoDB用の公式の本番環境対応GOドライバーがリリースされ、リリースから継続的に更新されています。このチュートリアルでは、Goドライバーを使用して簡単なMongoDBCRUD操作を実行する方法を学習します。

    前提条件 このチュートリアルを開始する前に2つのことが必要です。

    • 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への接続

    これで、基本セットアップの準備が整いました。 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ドライバーの公式ドキュメントを参照してください。


    1. すべてのキーを一覧表示せずに、サブフィールドをプロジェクションのトップレベルにプロモートします

    2. Debian9へのApacheCouchDBのインストール

    3. アプリケーションでマングースが発火するすべてのクエリをログに記録する

    4. Redisソートリストの使用方法