package main import ( "context" "fmt" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/mongo/readpref" ) type Customer struct { FirstName string LastName string CreditCard CreditCard } type CreditCard struct { Number string } func main() { client, err := mongo.NewClient( options.Client(). ApplyURI("mongodb://mongorootuser:mongorootpw@localhost:27017")) if err != nil { panic(err) } ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() err = client.Connect(ctx) if err != nil { panic(err) } defer func() { if err = client.Disconnect(ctx); err != nil { panic(err) } }() err = client.Ping(ctx, readpref.Primary()) if err != nil { panic(err) } collection := client.Database("shop").Collection("customer") customer := Customer{FirstName: "Hans", LastName: "wurst"} customer.CreditCard = CreditCard{Number: "123-123-123"} collection.InsertOne(ctx, customer) cursor, err := collection.Find(ctx, bson.D{{"firstname", "Hans"}}) if err != nil { panic(err) } defer cursor.Close(ctx) for cursor.Next(ctx) { var result bson.M err := cursor.Decode(&result) if err != nil { panic(err) } fmt.Printf("result is %v\n", result) } if err := cursor.Err(); err != nil { panic(err) } filter := bson.D{{"firstname", "Hans"}} updated := bson.M{ "$set": Customer{FirstName: "Peter", LastName: "Lustig"}, } res, err := collection.UpdateOne(ctx, filter, updated) if err != nil { panic(err) } fmt.Println(res.MatchedCount) collection.FindOneAndUpdate(ctx, filter, updated) collection.FindOneAndDelete(ctx, filter) }