Understanding BSON Types in the Go MongoDB Driver

Tejaksha K
2 min readMay 22, 2024

--

When working with MongoDB in Go, you interact with BSON (Binary JSON) documents. The Go MongoDB driver (go.mongodb.org/mongo-driver) provides several BSON types to represent documents that will be inserted, queried, or otherwise manipulated within MongoDB. Understanding these types is crucial for effective database operations.

Primary BSON Types

bson.M

bson.M is a map representation of a BSON document. The M stands for map. It is essentially a map[string]interface{} and is used when the document structure is not strictly defined or when you need to build documents dynamically.

Example:

filter := bson.M{"name": "Alice"}

This creates a BSON document equivalent to:

{
"name": "Alice"
}

bson.D

bson.D is a slice representation of a BSON document. The D stands for document. It preserves the order of elements, which can be important for certain MongoDB operations. It is a slice of bson.E (where E stands for element), which is a struct containing a key-value pair.

Example:

filter := bson.D{{"name", "Alice"}}

This creates a BSON document equivalent to:

{
"name": "Alice"
}

bson.A

bson.A is an array representation of a BSON document. The A stands for array. It is essentially a []interface{}.

Example:

filter := bson.M{"tags": bson.A{"tag1", "tag2"}}

This creates a BSON document equivalent to:

{
"tags": ["tag1", "tag2"]
}

bson.E

bson.E is used to represent an element in a bson.D document. It contains a key and a value.

Example:

element := bson.E{"name", "Alice"}

Usage Examples

Using bson.M

Creating a filter for a query:

filter := bson.M{
"age": bson.M{"$gt": 25},
"name": "Alice",
}

This filter matches documents where the age field is greater than 25 and the name field is "Alice".

Using bson.D

Creating the same filter with bson.D:

filter := bson.D{
{"age", bson.D{{"$gt", 25}}},
{"name", "Alice"},
}

This filter achieves the same result but retains the order of elements as inserted.

Querying with MongoDB Driver

Using bson.M to find a document:

collection := client.Database("testdb").Collection("users")
filter := bson.M{"name": "Alice"}

var result bson.M
err := collection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Println(result)

Using bson.D to find a document:

collection := client.Database("testdb").Collection("users")
filter := bson.D{{"name", "Alice"}}

var result bson.M
err := collection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Println(result)

Conclusion

  • Use bson.M when you need a flexible, unordered map to build your documents.
  • Use bson.D when you need to preserve the order of elements.
  • Use bson.A for arrays.
  • Use bson.E to create elements for bson.D.

Understanding these types will help you interact effectively with MongoDB using the Go driver, allowing for more precise and structured queries and document manipulations.

--

--

Tejaksha K
Tejaksha K

Written by Tejaksha K

I'm a Full Stack Developer & Cloud Expert with experience in Google Cloud Platform & AWS.

No responses yet