MongoDB golang操作
中文文档
链接
package main
import (
"context"
"fmt"
"log"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
clientOptions := options.Client().ApplyURI("mongodb://192.168.157.142:27017").SetAuth(
options.Credential{
Username: "admin",
Password: "12346",
},
)
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to MongoDB!")
err = client.Disconnect(context.TODO())
if err != nil {
log.Fatal(err)
} else {
fmt.Println("\nConnection to MongoDB closed.")
}
}
CURD
package main
import (
"context"
"fmt"
"log"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type Student struct {
Name string
Age int
}
func main() {
clientOptions := options.Client().ApplyURI("mongodb://192.168.157.142:27017")
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to MongoDB!\n")
collection := client.Database("test").Collection("trainers")
s1 := Student{"小红", 12}
s2 := Student{"小兰", 10}
s3 := Student{"小黄", 11}
insertResult, err := collection.InsertOne(context.TODO(), s1)
if err != nil {
log.Fatal(err)
}
fmt.Println("\nInserted a single document: ", insertResult.InsertedID)
students := []interface{}{s2, s3}
insertManyResult, err := collection.InsertMany(context.TODO(), students)
if err != nil {
log.Fatal(err)
}
fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)
filter := bson.D{{"name", "小兰"}}
update := bson.D{
{"$inc", bson.D{
{"age", 1},
}},
}
updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
log.Fatal(err)
}
fmt.Printf("\nMatched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)
var result Student
err = collection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Printf("\nFound a single document: %+v\n", result)
findOptions := options.Find()
findOptions.SetLimit(3)
findOptions.SetSkip(1)
var results []*Student
cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
if err != nil {
log.Fatal(err)
}
for cur.Next(context.TODO()) {
var elem Student
err := cur.Decode(&elem)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Found multiple document: %+v\n", elem)
results = append(results, &elem)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
cur.Close(context.TODO())
fmt.Printf("\nFound multiple documents (array of pointers): %+v\n\n", results)
deleteResult1, err := collection.DeleteOne(context.TODO(), bson.D{{"name", "小黄"}})
if err != nil {
log.Fatal(err)
}
fmt.Printf("\nDeleted %v documents in the trainers collection\n", deleteResult1.DeletedCount)
deleteResult2, err := collection.DeleteMany(context.TODO(), bson.D{{}})
if err != nil {
log.Fatal(err)
}
fmt.Printf("\nDeleted %v documents in the trainers collection\n", deleteResult2.DeletedCount)
err = collection.Drop(context.TODO())
if err != nil {
log.Fatal(err)
} else {
fmt.Println("\nDrop document")
}
err = client.Disconnect(context.TODO())
if err != nil {
log.Fatal(err)
} else {
fmt.Println("\nConnection to MongoDB closed.")
}
}
聚合
package main
import (
"context"
"fmt"
"log"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type IdDept struct {
Dept string
Age int
}
type ResultDept struct {
_id IdDept
DeptAvgSalary int
}
func main() {
clientOptions := options.Client().ApplyURI("mongodb://192.168.157.142:27017")
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to MongoDB!\n")
persons := client.Database("test").Collection("persons")
pipeline := []bson.M{
bson.M{"$project": bson.M{
"age": 1,
"dept": 1,
"salary": 1}},
bson.M{"$addFields": bson.M{"salary": bson.M{"$cond": bson.M{
"if": bson.M{"$lt": []interface{}{"$salary", 1000}},
"then": bson.M{"$add": []interface{}{"$salary", 4000}},
"else": "$salary"}}}},
bson.M{"$match": bson.M{"age": bson.M{"$gt": 22}}},
bson.M{"$sort": bson.M{"age": -1}},
bson.M{"$skip": 1},
bson.M{"$limit": 7},
bson.M{"$group": bson.M{
"_id": bson.M{"dept":"$dept", "age":"$age"},
"avg": bson.M{"$avg": "$salary"}}},
bson.M{"$sort": bson.M{"avg": -1}},
bson.M{"$limit": 3},
}
cur, err := persons.Aggregate(context.TODO(), pipeline)
if err != nil {
log.Fatal(err)
}
var results []*ResultDept
for cur.Next(context.TODO()) {
var elem map[string]interface{}
err := cur.Decode(&elem)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Found multiple document: %+v\n", elem)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
cur.Close(context.TODO())
fmt.Printf("\nAggregate multiple documents (array of pointers): %+v\n\n", results)
err = client.Disconnect(context.TODO())
if err != nil {
log.Fatal(err)
} else {
fmt.Println("\nConnection to MongoDB closed.")
}
}