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.

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more