How to Query (Single Doc) Data from Mongo with Go

In this tutorial, I will show you the basics of doing a query for a single document in a Mongo database instance with Go code. I will be on local and provide you with all steps.

Setup

I’m assuming you have Mongo installed on your local machine. I also recommend installing Mongo Compass to make it easier to see your data.

I am assuming you have Go installed and have successful compiled at least one Go file. This would confirm your environment works. We will be using my Go boierplate code to save time on setting up our code structure. It follows a handlers, models, repositories, services, and utils structure.

In short:

  • handlers handles the inbound request.
  • models contains all structs that represent data.
  • repositories has all methods for interacting with the database.
  • services contains the business logic of the app.
  • utils has any helper methods.

Download the Go boilerplate. Please give it a star on Github so I know people are still using and enjoying it. Move the files into your new project root. Open the files up in a text editor.

You need to do one thing for this boilerplate to work. Open services/user_service.go and within the IsValidPassword function. You will need to switch the variable to true. Do NOT use this code in production without fixing it. I leave encryption and password requirements up to you. This will store a plain text password till you add code to GetEncryptedPassword and IsValidPassword. For demo and dev purposes, this is fine.

You will need data in your database and checkout the insert tutorial.

Query Code

As you can imagine, we will be working with the repositories layer since it works with the database. If we open the repositories/cars_repository.go file, you can see the Delete method.

func (c *CarsRepository) Get(email string, carID string) (models.Car, error) {
	docID, err := primitive.ObjectIDFromHex(carID)
	if err != nil {
		return models.Car{}, err
	}

	filter := bson.M{"_id": docID, "email": email}

	var result models.Car
	err = c.db.Collection("cars").FindOne(context.TODO(), filter).Decode(&result)
	if err != nil {
		return models.Car{}, err
	}
	return result, nil
}

In the code above, we covert the ID from a string to an objectID. We will then set up our filter and delete one document.

Demo

In your terminal:

go run main.go

The first step is to run sign up or sign in. I execute my sign up request with Postman. Copy down the token in the response.

Screenshot of Github Workflow Running

Or you can run this curl command:

curl --location --request POST 'http://localhost:8080/user/signup/' \
--header 'Content-Type: application/json' \
--data-raw '{
 "email": "me@keithweaver.ca",
 "password": "demodemo1"
}'

Write down the token. Connect to your database and confirm that you have multiple values. Grab the id of one of the cars.

Screenshot of Github Workflow Running

Next, you will submit a GET request using this id.

Screenshot of Github Workflow Running

Or by curl:

curl --location --request GET 'http://localhost:8080/cars/<CAR_ID>' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_TOKEN_FROM_SIGN_UP_RESPONSE>'

And you can see it returns the car based on the ID.

Thanks for reading!