Golang操作mongoDB
学习要与时俱进
现在使用的是mongo 库是 "go.mongodb.org/mongo-driver/mongo"
不再是 "github.com/mongodb/mongo-go-driver/mongo"
package main
import (
"context"
"fmt"
"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"
"log"
"time"
)
type Trainer struct {
Name string
Age int
City string
}
var client *mongo.Client
func conf() (err error) {
// Set client options
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
// Connect to MongoDB
client, err = mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
//defer clone()
// Check the connection
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to MongoDB!")
return
}
func conf2() (err error) {
// mongodb+srv://<username>:<password>@cluster0-zzart.mongodb.net/test?retryWrites=true&w=majority
client, err = mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
log.Fatal(err)
}
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
err = client.Connect(ctx)
if err != nil {
log.Fatal(err)
}
err = client.Ping(ctx, readpref.Primary())
if err != nil {
log.Fatal(err)
}
return
}
func clone() {
err := client.Disconnect(context.TODO())
if err != nil {
log.Fatal(err)
}
fmt.Println("Connection to MongoDB closed.")
}
func main() {
conf2()
//选择数据库以及数据集
database := client.Database("zhang")
coll := database.Collection("jianwu")
//ash := Trainer{"Ash", 10, "Pallet Town"}
//misty := Trainer{"Misty", 10, "Cerulean City"}
//brock := Trainer{"Brock", 15, "Pewter City"}
//添加一条操作
//addOne(coll,ash)
//插入多条
//trainers := []interface{}{misty, brock}
//addMany(coll,trainers)
//更新
//upOne(coll)
//查一个
//selData(coll)
//查多个
//selMany(coll)
//删除
del(coll)
}
func addOne(coll *mongo.Collection, ash Trainer) {
//插入单条
insertResult, err := coll.InsertOne(context.TODO(), ash)
if err != nil {
log.Fatal(err)
}
fmt.Println("Inserted a single document: ", insertResult.InsertedID)
}
func addMany(coll *mongo.Collection, trainers []interface{}) {
insertManyResult, err := coll.InsertMany(context.TODO(), trainers)
if err != nil {
log.Fatal(err)
}
fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)
}
func upOne(coll *mongo.Collection) {
//更新
filter := bson.D{{"name", "Ash"}}
update := bson.D{
{"$inc", bson.D{
{"age", 1},
}},
}
updateResult, err := coll.UpdateOne(context.TODO(), filter, update)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)
}
//查一条数据
func selData(coll *mongo.Collection){
filter := bson.D{{"name", "Ash"}}
var result Trainer
err := coll.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Found a single document: %+v\n", result)
}
//查多条数据
func selMany(coll *mongo.Collection) {
// Pass these options to the Find method
findOptions := options.Find()
findOptions.SetLimit(2)
// Here's an array in which you can store the decoded documents
var results []*Trainer
// Passing bson.D{{}} as the filter matches all documents in the collection
cur, err := coll.Find(context.TODO(), bson.D{{"name", "Ash"}}, findOptions)
if err != nil {
log.Fatal(err)
}
// Finding multiple documents returns a cursor
// Iterating through the cursor allows us to decode documents one at a time
for cur.Next(context.TODO()) {
// create a value into which the single document can be decoded
var elem Trainer
err := cur.Decode(&elem)
if err != nil {
log.Fatal(err)
}
results = append(results, &elem)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
// Close the cursor once finished
cur.Close(context.TODO())
fmt.Printf("Found multiple documents (array of pointers): %+v\n", results)
for x,y := range results{
fmt.Println(x,y)
}
}
func del(coll *mongo.Collection) {
deleteResult, err := coll.DeleteMany(context.TODO(), bson.D{{"name", "Ash"},{"age", 10}})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult.DeletedCount)
}