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

GoLangのデータソースとしてMongoDBを使用する

    始める前に

    このチュートリアルでは、次のことを前提としています。

    • GoLanguageの基本的な理解
    • システムにインストールされている最新のGoLangバージョン
    • システムにインストールされている最新のMongoDBバージョン

    このチュートリアルでは、公式のMongoDBGoドライバーを使用します MongoDBデータベースを管理します。適正手続きでは、MongoDB Goドライバーをインストールし、それを使用してCRUD操作を実行する方法を学習するプログラムを作成します。

    インストール

    最初に空のフォルダで以下のコマンドを実行します

    go mod init gomongo

    go mod init 新しいgo.modファイルを作成し、goプログラムを実行するときに依存関係を自動的にインポートします。次に、ファイルmain.goを作成し、以下のコードを記述します。このコードが何をするかを簡単に説明します。

    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"
    )
    
    // Book - We will be using this Book type to perform crud operations
    type Book struct {
      Title     string
      Author    string
      ISBN      string
      Publisher string
      Copies     int
    }
    
    func main() {
        
      // Set client options
      clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
    
      // Connect to MongoDB
      client, err := mongo.Connect(context.TODO(), clientOptions)
    
      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!")
      booksCollection := client.Database("testdb").Collection("books")
    }

    上記のコードでは、mongo-driverのbson、mongo、mongo / optionsパッケージをインポートし、Bookを定義しました。 このチュートリアルで使用するタイプ

    最初のメイン関数では、MongoDBのURLとクレデンシャルを使用してclientOptionsを作成し、それをmongo.Connectに渡しました。 関数、接続したら、client.Pingで接続を確認できます 機能。

    次のコードはbooksCollectionを使用します booksをクエリする変数 testdbからのコレクション。

    booksCollection := client.Database("testdb").Collection("books")

    ドキュメントを挿入

    まず、コレクションに挿入するBook構造体を作成しましょう。以下のコードでは、collection.InsertOneを使用しています。 コレクションに単一のドキュメントを挿入する関数

    // Insert One document
    book1 := Book{"Animal Farm", "George Orwell", "0451526341", "Signet Classics", 100}
    insertResult, err := booksCollection.InsertOne(context.TODO(), book1)
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Println("Inserted a single document: ", insertResult.InsertedID)

    複数のドキュメントを一度に挿入するには、Bookのスライスを作成する必要があります オブジェクトを作成し、collection.InsertManyに渡します

    // Insert multiple documents
    book2 := Book{"Super Freakonomics", "Steven D. Levitt", "0062312871", "HARPER COLLINS USA", 100}
    book3 := Book{"The Alchemist", "Paulo Coelho", "0062315005", "HarperOne", 100}
    multipleBooks := []interface{}{book2, book3}
    
    insertManyResult, err := booksCollection.InsertMany(context.TODO(), multipleBooks)
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)

    ドキュメントの更新

    関数collection.UpdateOneで1つのドキュメントを更新できます 。コレクション内のドキュメントと一致するフィルタードキュメントと、更新操作を説明する更新されたドキュメントが必要です。これらはbson.Dタイプを使用して構築できます。以下のコードは、本を ISBNと一致させます 0451526341 コピーフィールドを10ずつインクリメントします

    //Update one document
    filter := bson.D{{"isbn", "0451526341"}}
    
    update := bson.D{
        {"$inc", bson.D{
            {"copies", 10},
        }},
    }
    
    updateResult, err := booksCollection.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)

    関数collection.UpdateManyを使用して、1つのコレクションで一度に複数のドキュメントを更新することもできます。 、その中で、collection.UpdateOneと同じようにフィルタードキュメントを渡してドキュメントを更新する必要があります

    ドキュメントの検索

    単一のドキュメントを検索するには、関数collection.FindOne()を使用できます。 、フィルタードキュメントを渡し、結果をBookでデコードします 型変数

    // A variable in which result will be decoded
    var result Book
    
    err = booksCollection.FindOne(context.TODO(), filter).Decode(&result)
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Printf("Found a single document: %+v\n", result)

    複数のドキュメントを検索するには、関数collection.Find()を使用します 。このメソッドはカーソルを返します。これは、反復できるドキュメントのストリームを提供するか、関数cursor.All()によってすべてのドキュメントを取得できます。 Bookのスライスで タイプ。

    cursor, err := booksCollection.Find(context.TODO(), bson.D{{}})
    if err != nil {
      log.Fatal(err)
    }
    var books []Book
    if err = cursor.All(context.TODO(), &books); err != nil {
      log.Fatal(err)
    }
    fmt.Printf("Found multiple documents: %+v\n", books)

    ドキュメントを削除

    関数collection.DeleteOne()を使用して、コレクションからドキュメントを削除できます。 またはcollection.DeleteMany() 。ここでは、bson.D {{}}をフィルター引数として渡します。これは、コレクション内のすべてのドキュメントと一致します。

    deleteCollection, err := booksCollection.DeleteMany(context.TODO(), bson.D{{}})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Deleted %v documents in the books collection\n", deleteCollection.DeletedCount)

    collection.Drop()関数を使用してコレクション全体を削除できます。これにより、コレクションからインデックスなどのすべてのドキュメントとメタデータが削除されます

    すべての操作が完了したら、MongoDB接続を閉じることを忘れないでください

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

    これで、GoアプリケーションのデータソースとしてMongoDBを簡単に使用できます。このチュートリアルで使用されている完全なコードは、Githubリポジトリにあります


    1. 共有ライブラリのロード中にエラーが発生しました。共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません(hiredis)

    2. MongoDB全文および部分テキスト検索

    3. 一言で言えばClouderaオペレーショナルデータベースレプリケーション

    4. MongoDBでマルチキーインデックスを作成する