DEV Community

Anurag Affection
Anurag Affection

Posted on

Get API & Fetching Data from MongoDB in Go - 05

  • First check the Go version by running the command
go version
Enter fullscreen mode Exit fullscreen mode
  • Create a folder
mkdir <folder_name>
Enter fullscreen mode Exit fullscreen mode
  • Switch to created folder
cd <folder_name>
Enter fullscreen mode Exit fullscreen mode
  • Initialize the go project by running the given command. You will get go.mod file.
go mod init <folder_name>
Enter fullscreen mode Exit fullscreen mode
  • Create a main.go file, use terminal or bash
notepad main.go 
touch main.go
Enter fullscreen mode Exit fullscreen mode
  • Let's write some basic code in main.go file.
package main 

import (
    "fmt"
)


func main () {
    fmt.Println("Hello From Go")
}

Enter fullscreen mode Exit fullscreen mode
  • Run the code by following command
go run main.go 
Enter fullscreen mode Exit fullscreen mode
  • You will see this output in console
Hello From Go
Enter fullscreen mode Exit fullscreen mode
  • Install some packages to connect MongoDB. Here are commands
go get go.mongodb.org/mongo-driver
go get go.mongodb.org/mongo-driver/mongo
Enter fullscreen mode Exit fullscreen mode
  • Revisit the main.go file to connect MongoDB. Add some code to connect MongoDB. This is how it will look after adding.
package main 

// package importing
import (
    "fmt"

    "log"
    "context"

    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)


// mongodb connections
var collection *mongo.Collection
var ctx = context.TODO()

func init() {
    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017/")
    client, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
        log.Fatal(err)
    }

    // check connection
    err = client.Ping(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Connected to MongoDB!")

    collection = client.Database("testingWithGo").Collection("movies")
}



// entry point 
func main () {
    fmt.Println("Hello From Go")
}
Enter fullscreen mode Exit fullscreen mode
  • Run the code by following command
go run main.go 
Enter fullscreen mode Exit fullscreen mode
  • You will see this output in console
Connected to MongoDB!
Hello From Go
Enter fullscreen mode Exit fullscreen mode
  • Till, Our MongoDB is connected. Now let's add some data. We are going to add movie data. So, let's make a movie structure.
// movie model or structure 
type Movie struct {
    ID    string `json:"id"`
    Title string `json:"title"`
}
Enter fullscreen mode Exit fullscreen mode
  • Now write a function to add movie to database.
// to add movie to db
func addMovie(id, title string) {

    movie := Movie{
        ID:    id,
        Title: title,
    }

    _, err := collection.InsertOne(ctx, movie)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Movie added successfully!")
}
Enter fullscreen mode Exit fullscreen mode
  • Call the addMovie function to main function.
addMovie("1", "Captain America")
Enter fullscreen mode Exit fullscreen mode
  • This is how our code will look like after completing above steps
package main 

// package importing
import (
    "fmt"

    "log"
    "context"

    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)




// mongodb connections
var collection *mongo.Collection
var ctx = context.TODO()

func init() {
    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017/")
    client, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
        log.Fatal(err)
    }

    // check connection
    err = client.Ping(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Connected to MongoDB!")

    collection = client.Database("testingWithGo").Collection("movies")
}



// movie model or structure 
type Movie struct {
    ID    string `json:"id"`
    Title string `json:"title"`
}


// to add movie to db
func addMovie(id, title string) {

    movie := Movie{
        ID:    id,
        Title: title,
    }

    _, err := collection.InsertOne(ctx, movie)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Movie added successfully!")
}




// entry point 
func main () {
    fmt.Println("Hello From Go")

    // callig addMovie 
    addMovie("1", "Captain America")
}
Enter fullscreen mode Exit fullscreen mode
  • Run the code by following command
go run main.go 
Enter fullscreen mode Exit fullscreen mode
  • You will see this output in console
Connected to MongoDB!
Hello From Go
Movie added successfully!
Enter fullscreen mode Exit fullscreen mode
  • We have successfully added some data to MongoDB, you can verify in your database, which is your localhost.
mongodb://localhost:27017/
Enter fullscreen mode Exit fullscreen mode
  • Now import these packages
"encoding/json"
"net/http"
"go.mongodb.org/mongo-driver/bson"
Enter fullscreen mode Exit fullscreen mode
  • This how our import will look like
// package importing
import (
    "fmt"

    "log"
    "context"

    "encoding/json"
    "net/http"

        "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

Enter fullscreen mode Exit fullscreen mode
  • Now write a function to getAllMovies. Here is the code
// api to get all movies
func getAllMovies(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    // Define a slice to store the decoded documents
    var movies []Movie

    // Find all movies in the collection
    cursor, err := collection.Find(ctx, bson.M{})
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer cursor.Close(ctx)

    // Iterate through the cursor and decode each document
    for cursor.Next(ctx) {
        var movie Movie
        if err := cursor.Decode(&movie); err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        movies = append(movies, movie)
    }

    // Check for cursor errors after iterating
    if err := cursor.Err(); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // Encode the movies slice as JSON and write it to the response
    if err := json.NewEncoder(w).Encode(movies); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}
Enter fullscreen mode Exit fullscreen mode
  • Call the getAllMovies with route in main, also run the server.
        // api to getAllMovies 
    http.HandleFunc("/movies", getAllMovies)

    // our server on port on 8000
    http.ListenAndServe(":8000", nil)
Enter fullscreen mode Exit fullscreen mode
  • Let's have a full code, after completing all the above steps
package main 

// package importing
import (
    "fmt"

    "log"
    "context"

    "encoding/json"
    "net/http"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)




// mongodb connections
var collection *mongo.Collection
var ctx = context.TODO()

func init() {
    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017/")
    client, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
        log.Fatal(err)
    }

    // check connection
    err = client.Ping(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Connected to MongoDB!")

    collection = client.Database("testingWithGo").Collection("movies")
}



// movie model or structure 
type Movie struct {
    ID    string `json:"id"`
    Title string `json:"title"`
}


// to add movie to db
func addMovie(id, title string) {

    movie := Movie{
        ID:    id,
        Title: title,
    }

    _, err := collection.InsertOne(ctx, movie)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Movie added successfully!")
}





// api to get all movies
func getAllMovies(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    // Define a slice to store the decoded documents
    var movies []Movie

    // Find all movies in the collection
    cursor, err := collection.Find(ctx, bson.M{})
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer cursor.Close(ctx)

    // Iterate through the cursor and decode each document
    for cursor.Next(ctx) {
        var movie Movie
        if err := cursor.Decode(&movie); err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        movies = append(movies, movie)
    }

    // Check for cursor errors after iterating
    if err := cursor.Err(); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // Encode the movies slice as JSON and write it to the response
    if err := json.NewEncoder(w).Encode(movies); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}






// entry point 
func main () {
    fmt.Println("Hello From Go")

    // callig addMovie 
    addMovie("1", "Captain America")

    // api to getAllMovies 
    http.HandleFunc("/movies", getAllMovies)

    // visit this url in browser
    fmt.Println("Your Server is running on http://localhost:8000")

    // our server on port on 8000
    http.ListenAndServe(":8000", nil)
}
Enter fullscreen mode Exit fullscreen mode
  • Run the code by following command
go run main.go 
Enter fullscreen mode Exit fullscreen mode
  • You will see this output in console
Connected to MongoDB!
Hello From Go
Movie added successfully!
Your Server is running on http://localhost:8000

Enter fullscreen mode Exit fullscreen mode
  • Visit http://localhost:8000/movies on browser to verify the API. This what you will get.
[
    {
        "id": "1",
        "title": "The Shawshank Redemption"
    },
    {
        "id": "1",
        "title": "The Shawshank Redemption"
    },
    {
        "id": "1",
        "title": "Captain America"
    },
    {
        "id": "1",
        "title": "Captain America"
    },
    {
        "id": "1",
        "title": "Captain America"
    },
    {
        "id": "1",
        "title": "Captain America"
    }
]
Enter fullscreen mode Exit fullscreen mode

That's for this article. Thank You.

Top comments (0)