FlatBSON recursively flattens a Go struct using its BSON tags.
It is particularly useful for partially updating embedded Mongo documents.
For example, to update a User
's Address.Visited
field, first call flatbson.Flatten
with the parent struct:
type User struct {
ID bson.ObjectID `bson:"_id,omitempty"`
Name string `bson:"name,omitempty"`
Address Address `bson:"address,omitempty"`
}
type Address struct {
Street string `bson:"street,omitempty"`
City string `bson:"city,omitempty"`
State string `bson:"state,omitempty"`
VisitedAt time.Time `bson:"visitedAt,omitempty"`
}
flatbson.Flatten(User{Address: {VisitedAt: time.Now().UTC()}})
// Result:
// map[string]interface{}{"address.visitedAt": time.Time{...}}
Passing the result to coll.UpdateOne
updates only the address.VisitedAt
field instead of overwriting the entire address
embedded document. See this blog post for more information.
The complete documentation is available on Godoc.
go get -v github.com/chidiwilliams/flatbson