时间:2021-05-22
MongoDB是Nosql中常用的一种数据库,今天笔者就简单总结一下Golang如何使用这些通用的供能的,不喜勿喷。。。
研究的事例结构如下:
type LikeBest struct { AuthorName string `bson:"authorname,omitempty"` BookName string `bson:"bookname,omitempty"` PublishTime string `bson:"publishtime,omitempty"` LastReadTime string `bson:"lastreadtime,omitempty"`}type Personnal struct { UserName string `bson:"username,omitempty"` WhereCity string `bson:"wherecity,omitempty"` BookSCount int `bson:"bookscount,omitempty"` FavoriteBooks []LikeBest `bson:"favoratebooks,omitempty"`}建立与MongoDB的连接
session, err := mgo.Dial("localhost:27017") if err != nil { panic(err) } defer session.Close() c := session.DB("PersonManage").C("Persons")注意:以下操作条件默认均为:username=”impressionw”
1、使用Insert()函数是最简单且通用的方式
err := c.Insert(&p) //p为插入的结构体数据2、使用upsert()函数【更新或插入】
change := mgo.Change{ Update: bson.M{"$set": p}, ReturnNew: false, Remove: false, Upsert: true,}_, err := c.Find(bson.M{"username": "impressionw"}).Apply(change, nil) 或许,你觉得第一种方式更简洁,但是实际场景中,第二种也非常实用
1. 它不仅只能插入数据,Update字段可以接收多个参数插入,但是关键字不能相同【不能同时有2个”$set”】
2. 它能返回处理前或处理后的document,若返回,则Apply的第二个参数即是结果
3. 它可以结合select使用
注意:$set 只修改指定字段的值,不影响其他值
1、查询整个文档
err = c.Find(bson.M{"username": "impressionw"}).One(&result)2、只返回 FavoriteBooks 对应的字段,忽略其他信息
这里用到了Select(),select可以设置,返回的内容:
3、查询文档的_id
var result interface{}err = c.Find(bson.M{"username": "impressionw"}).Select(bson.M{"_id": 1}).One(&result)var document_id stringswitch value := result.(type) {case bson.M: mapid := value["_id"] if mapid != nil { id := mapid.(bson.ObjectId) document_id = id.Hex() }}注意:若是查找username含有”impressionw”的文档,可用正则匹配查找,条件这样写:
query = bson.M{"username": bson.M{"$regex": "impressionw"}}4、查询数组中匹配元素,只返回含有匹配元素的文档,需要用到Mongdob的聚合aggregate
相关操作符的含义如下:
下面的代码,将只返回FavorateBooks字段中,bookname为”The Go Programming Language”的书籍,且只关注favoratebooks,不会输出个人信息
pipe := c.Pipe([]bson.M{{"$unwind": "$favoratebooks"}, {"$match": bson.M{"username": "impressionw", "favoratebooks.bookname": "The Go Programming Language"}}, {"$project": bson.M{"favoratebooks": 1}}})resp := []bson.M{}err := pipe.All(&resp)这样可以达到目的了
1、更新WhereCity字段—关键字 $set,将WhereCity修改为”ShangHai“:
err = c.Update(bson.M{"username": "impressionw"}, bson.M{"$set": bson.M{"wherecity": "ShangHai"}})2、更新FavoriteBooks中的LastReadTime字段
查询条件:username=”impressionw”、bookname=”The Go Programming Language”,将LastReadTime字段更改为:”Oct 26, 2017”
change := mgo.Change{ Update: bson.M{"$set": bson.M{"favoratebooks.$.lastreadtime": "Oct 26, 2017"}}, ReturnNew: false, Remove: false, Upsert: true, }query := bson.M{"username": "impressionw", "favoratebooks": bson.M{"$elemMatch": bson.M{"bookname": "The Go Programming Language"}}}_, err = c.Find(query).Select(bson.M{"favoratebooks.bookname": 1}).Apply(change, nil)3、更新一个 FavoriteBooks 的整个数组文档,即新增一本书的信息
给username=”impressionw”的文档新增一条书籍记录,同时将BookSCount字段自增1
注意:
1、此处可用addToSet代替push,addToSet不会添加已有的数据,push 会添加重复的数据,可以分别应用于不同场景
2、$inc 对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作, 值为正数表示自增,值为负数表示自减
1、删除喜欢的一本书籍信息,同时喜欢书记数量自减1
var option = bson.M{"$pull": bson.M{"favoratebooks": bson.M{"bookname": "Go Learning"}}, "$inc": bson.M{"bookscount": -1}}err := c.Update(bson.M{"username": "impressionw"}, option)2、删除所有喜欢的书籍,同时将bookscount字段置为 0
var data = bson.M{"$unset": bson.M{"favoratebooks": true}, "$set": bson.M{"bookscount": 0}}err = c.Update(bson.M{"username": "impressionw"}, data)3、删除整个文档,根据”_id”字段删除文档
err := session.DB("PersonManage").C("Persons").Remove(bson.M{"_id":bson.ObjectIdHex("到此这篇关于详解Golang使用MongoDB通用操作的文章就介绍到这了,更多相关Golang使用MongoDB通用操作内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言Golang对MongoDB的操作简单封装使用MongoDB的Go驱动库mgo,对MongoDB的操作做一下简单封装mgo(音mango)是MongoDB的
MongoDB中Limit与Skip的使用方法详解一MongoDBLimit()方法如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的
golang常用库:gorilla/mux-http路由库使用golang常用库:配置文件解析库-viper使用golang常用库:操作数据库的orm框架-go
上篇文章给大家介绍了Mongodb中MapReduce实现数据聚合方法详解,我们提到过Mongodb中进行数据聚合操作的一种方式——MapReduce,但是在大
详解mongoDB主从复制搭建详细过程实验目的搭建mongoDB主从复制主192.168.0.4从192.168.0.7mongodb的安装1:下载mongod