Golang使用MongoDB通用操作
本文内容纲要:
MongoDB是Nosql中常用的一种数据库,今天笔者就简单总结一下Golang如何使用这些通用的供能的,不喜勿喷。。。
研究的事例结构如下:
typeLikeBeststruct{
AuthorNamestring`bson:"authorname,omitempty"`
BookNamestring`bson:"bookname,omitempty"`
PublishTimestring`bson:"publishtime,omitempty"`
LastReadTimestring`bson:"lastreadtime,omitempty"`
}
typePersonnalstruct{
UserNamestring`bson:"username,omitempty"`
WhereCitystring`bson:"wherecity,omitempty"`
BookSCountint`bson:"bookscount,omitempty"`
FavoriteBooks[]LikeBest`bson:"favoratebooks,omitempty"`
}
建立与MongoDB的连接
session,err:=mgo.Dial("localhost:27017")
iferr!=nil{
panic(err)
}
defersession.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)
或许,你觉得第一种方式更简洁,但是实际场景中,第二种也非常实用
- 它不仅只能插入数据,Update字段可以接收多个参数插入,但是关键字不能相同【不能同时有2个”$set”】
- 它能返回处理前或处理后的document,若返回,则Apply的第二个参数即是结果
- 它可以结合select使用
注意:$set只修改指定字段的值,不影响其他值
查询数据
1、查询整个文档
err=c.Find(bson.M{"username":"impressionw"}).One(&result)
2、只返回FavoriteBooks对应的字段,忽略其他信息
这里用到了Select(),select可以设置,返回的内容:
select{‘filedname’:0},表示忽略该字段则结果不返回此字段
select{‘filedname’:1},表示关注该字段则只返回关注字段
err=c.Find(bson.M{"username":"impressionw"}).Select(bson.M{"favoratebooks":1}).One(&result)
3、查询文档的_id
varresultinterface{}
err=c.Find(bson.M{"username":"impressionw"}).Select(bson.M{"_id":1}).One(&result)
vardocument_idstring
switchvalue:=result.(type){
casebson.M:
mapid:=value["_id"]
ifmapid!=nil{
id:=mapid.(bson.ObjectId)
document_id=id.Hex()
}
}
注意:若是查找username含有”impressionw”的文档,可用正则匹配查找,条件这样写:
query=bson.M{"username":bson.M{"$regex":"impressionw"}}
4、查询数组中匹配元素,只返回含有匹配元素的文档,需要用到Mongdob的聚合aggregate
相关操作符的含义如下:
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
下面的代码,将只返回FavorateBooks字段中,bookname为”TheGoProgrammingLanguage”的书籍,且只关注favoratebooks,不会输出个人信息
pipe:=c.Pipe([]bson.M{{"$unwind":"$favoratebooks"},
{"$match":bson.M{"username":"impressionw","favoratebooks.bookname":"TheGoProgrammingLanguage"}},
{"$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=”TheGoProgrammingLanguage”,将LastReadTime字段更改为:”Oct26,2017”
change:=mgo.Change{
Update:bson.M{"$set":bson.M{"favoratebooks.$.lastreadtime":"Oct26,2017"}},
ReturnNew:false,
Remove:false,
Upsert:true,
}
query:=bson.M{"username":"impressionw","favoratebooks":bson.M{"$elemMatch":bson.M{"bookname":"TheGoProgrammingLanguage"}}}
_,err=c.Find(query).Select(bson.M{"favoratebooks.bookname":1}).Apply(change,nil)
3、更新一个FavoriteBooks的整个数组文档,即新增一本书的信息
给username=”impressionw”的文档新增一条书籍记录,同时将BookSCount字段自增1
Act:=[]LikeBest{
LikeBest{
AuthorName:"YuHen",
BookName:"GoLearning",
PublishTime:"Dec27,2014",
LastReadTime:"Dec29,2016",
},
}
change:=mgo.Change{
Update:bson.M{"$inc":bson.M{"bookscount":1},"$push":bson.M{"favoratebooks":bson.M{"$each":Act}}},
ReturnNew:false,
Remove:false,
Upsert:true,
}
_,err:=c.Find(bson.M{"username":"impressionw"}).Apply(change,nil)
注意:
1、此处可用addToSet代替addToSet代替push,addToSet不会添加已有的数据,addToSet不会添加已有的数据,push会添加重复的数据,可以分别应用于不同场景
2、$inc对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作,值为正数表示自增,值为负数表示自减
删除文档
1、删除喜欢的一本书籍信息,同时喜欢书记数量自减1
varoption=bson.M{"$pull":bson.M{"favoratebooks":bson.M{"bookname":"GoLearning"}},"$inc":bson.M{"bookscount":-1}}
err:=c.Update(bson.M{"username":"impressionw"},option)
2、删除所有喜欢的书籍,同时将bookscount字段置为0
vardata=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("5b6c0536a8ab29200debcb0b")})
本文内容总结:
原文链接:https://www.cnblogs.com/dfsxh/p/10208780.html