安装好mongodb后咱们就可以用go来操作mongodb, 进行快乐的CRUD了
安装mogodb驱动
$ go get github.com/mongodb/mongo-go-driver 复制代码
连接mongodb
// 设置客户端连接配置 clientOptions := options.Client().ApplyURI("mongodb://user:pwd@server:port/db") // 连接到MongoDB client, err := mongo.Connect(context.TODO(), clientOptions) if err != nil { log.Fatal(err) } else { fmt.Printf("client %#v \n", client) // client &mongo.Client{...} }复制代码
检查连接
// 检查连接 err = client.Ping(context.TODO(), nil) if err != nil { log.Fatal(err) } else { fmt.Println("Connected to MongoDB!") }复制代码
连接数据集
相当于mysql中的table
// 数据集 collection := client.Database("db").Collection("coder") fmt.Printf("collection %#v \n", collection) // collection &mongo.Collection{...}复制代码
增加一行文档
相当于js的db.coder.insertOne({})
s1 := Coder{"写代码的老哥0", 35} insertResult, err := collection.InsertOne(context.TODO(), s1) if err != nil { log.Fatal(err) } fmt.Println("Inserted a single document: ", insertResult.InsertedID) // ObjectID("5fe81819be51c1175cd95ba3")复制代码
用Robo 3T查看
增加多行文档
相当于js的db.coder.insertMany([...])
// 插入多个 s2 := Coder{"写代码的老哥1", 36} s3 := Coder{"写代码的老哥2", 37} coders := []interface{}{s2, s3} insertManyResult, err := collection.InsertMany(context.TODO(), coders) if err != nil { log.Fatal(err) } fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs) // Inserted multiple documents: [ObjectID("5fe818a70bb1cc7b7b030fe7") ObjectID("5fe818a70bb1cc7b7b030fe8")]复制代码
查找一个
相当于js的bd.coder.find(filter)
filter := bson.D{{"name", "写代码的老哥0"}} var result Coder err = collection.FindOne(context.TODO(), filter).Decode(&result) if err != nil { log.Fatal(err) } fmt.Printf("Found a single document: %+v\n", result)复制代码
查找多个
相当于js的db.coder.find()
// 查询多个// 将选项传递给Find() findOptions := options.Find() findOptions.SetLimit(2) // 定义一个切片用来存储查询结果var results []*Coder // 把bson.D{{}}作为一个filter来匹配所有文档 cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions) if err != nil { log.Fatal(err) } // 查找多个文档返回一个游标// 遍历游标允许我们一次解码一个文档for cur.Next(context.TODO()) { // 创建一个值,将单个文档解码为该值var elem Coder err := cur.Decode(&elem) if err != nil { log.Fatal(err) } results = append(results, &elem) } if err := cur.Err(); err != nil { log.Fatal(err) } // 完成后关闭游标 cur.Close(context.TODO()) fmt.Printf("Found multiple documents (array of pointers): %#v\n", results) for index, coder := range results { fmt.Printf("coder %v name %v age %v \n", index, coder.Name, coder.Age) }复制代码
更新
相当于js的db.coder.update(...)
// 查找过滤 filter := bson.D{{"name", "写代码的老哥0"}} // 更新 update := bson.D{ {"$inc", bson.D{ {"age", 1}, }}, } updateResult, err := collection.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)复制代码
删除一个
相当于js的db.coder.deleteOne(...)
deleteResult1, err := collection.DeleteOne(context.TODO(), bson.D{{"name","写代码的老哥0"}}) if err != nil { log.Fatal(err) } fmt.Printf("Deleted %v documents in the collection\n", deleteResult1.DeletedCount)复制代码
删除多个
相当于js的db.coder.drop()
// 删除所有 deleteResult2, err := collection.DeleteMany(context.TODO(), bson.D{{}}) if err != nil { log.Fatal(err) } fmt.Printf("Deleted %v documents in the collection\n", deleteResult2.DeletedCount)复制代码
有疑问加站长微信联系(非本文作者)