MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Używanie MongoDB jako źródła danych w GoLang

Zanim zaczniesz

Ten samouczek zakłada, że ​​masz:

  • Podstawowe zrozumienie języka Go
  • Najnowsza wersja GoLang zainstalowana w Twoim systemie
  • Najnowsza wersja MongoDB zainstalowana w Twoim systemie

W tym samouczku użyjemy oficjalnego sterownika MongoDB Go do zarządzania naszą bazą danych MongoDB. W odpowiednim procesie napiszemy program, który dowie się, jak zainstalować sterownik MongoDB Go i wykonywać z nim operacje CRUD.

Instalacja

Najpierw w pustym folderze uruchom poniższe polecenie

go mod init gomongo

go mod init tworzy nowy plik go.mod i automatycznie importuje zależności po uruchomieniu programu go. Następnie stwórz plik main.go i napisz poniższy kod, W ciągu min wyjaśnimy, co ten kod zrobi.

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")
}

W powyższym kodzie zaimportowaliśmy pakiety bson, mongo i mongo/options z mongo-driver i zdefiniowaliśmy Book typ, który będzie używany w tym samouczku

W głównej funkcji najpierw utworzyliśmy clientOptions z adresem URL MongoDB i poświadczeniami i przekazaliśmy je do mongo.Connect funkcja, Po połączeniu możemy sprawdzić nasze połączenie przez client.Ping funkcja.

Poniższy kod użyje booksCollection zmienna do zapytania books zbieranie z testdb.

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

Wstaw dokumenty

Najpierw stwórzmy strukturę Book do wstawienia do kolekcji, w poniższym kodzie używamy collection.InsertOne funkcja wstawiania pojedynczego dokumentu do kolekcji

// 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)

Aby wstawić wiele dokumentów naraz, musimy utworzyć kawałek books obiektu i przekaż go do 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)

Aktualizuj dokumenty

Możemy zaktualizować pojedynczy dokument za pomocą funkcji collection.UpdateOne . Wymaga dokumentu filtru, aby dopasować dokumenty w kolekcji i zaktualizowanego dokumentu, aby opisać operację aktualizacji. Możesz je zbudować za pomocą typów bson.D. Poniższy kod będzie pasował do książki z ISBN 0451526341 i zwiększ pole kopii o 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)

Możesz także zaktualizować więcej niż jeden dokument na raz w jednej kolekcji, korzystając z funkcji collection.UpdateMany , W nim musimy przekazać dokument filtru i zaktualizować dokument tak samo jak collection.UpdateOne

Znajdź dokumenty

Aby znaleźć pojedynczy dokument, możemy użyć funkcji collection.FindOne() , przekażemy dokument filtrujący i zdekodujemy wynik w Book wpisz zmienną

// 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)

Aby znaleźć wiele dokumentów, używamy funkcji collection.Find() . Ta metoda zwraca kursor, zapewnia strumień dokumentów, na którym możemy iterować lub możemy pobrać wszystkie dokumenty za pomocą funkcji cursor.All() w kawałku books rodzaj.

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)

Usuń dokumenty

Możemy usunąć dokumenty z kolekcji za pomocą funkcji collection.DeleteOne() lub collection.DeleteMany() . Tutaj przekazujesz bson.D{{}} jako argument filtra, który będzie pasował do wszystkich dokumentów w kolekcji.

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)

Całą kolekcję można usunąć za pomocą funkcji collection.Drop(), która usunie wszystkie dokumenty i metadane, takie jak indeksy z kolekcji

Po wykonaniu wszystkich operacji nie zapomnij zamknąć połączenia MongoDB

err = client.Disconnect(context.TODO())

if err != nil {
    log.Fatal(err)
}

fmt.Println("Connection to MongoDB closed.")

Teraz możesz z łatwością używać MongoDB jako źródła danych w swojej aplikacji go. Pełny kod użyty w tym samouczku można znaleźć w naszym repozytorium Github


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak przetestować metodę, która łączy się z mongo, bez faktycznego łączenia się z mongo?

  2. Zarządzanie długotrwałymi operacjami w MongoDB

  3. Mongoose.js:Znajdź użytkownika według nazwy użytkownika LIKE wartość

  4. Jak znaleźć przecięcie zestawów między dokumentami w jednej kolekcji w MongoDB?

  5. Mongoose JS findOne zawsze zwraca wartość null