博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang使用MongoDB通用操作
阅读量:7028 次
发布时间:2019-06-28

本文共 4498 字,大约阅读时间需要 14 分钟。

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可以设置,返回的内容:

select{‘filedname’:0},表示忽略该字段则结果不返回此字段select{‘filedname’:1},表示关注该字段则只返回关注字段err = c.Find(bson.M{
"username": "impressionw"}).Select(bson.M{
"favoratebooks": 1}).One(&result)

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

相关操作符的含义如下:

$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。

match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
下面的代码,将只返回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

Act := []LikeBest{LikeBest{AuthorName: "YuHen",BookName: "Go Learning",PublishTime: "Dec 27, 2014",LastReadTime: "Dec 29, 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

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("5b6c0536a8ab29200debcb0b")})

 

转载于:https://www.cnblogs.com/dfsxh/p/10208780.html

你可能感兴趣的文章
2.页面布局示例笔记
查看>>
一些老游戏CPU 100%占用的解决方法
查看>>
f5基本介绍
查看>>
博前语
查看>>
Java SE核心之一:常用类,包装类,其他基本数据类型包装类。
查看>>
郑捷《机器学习算法原理与编程实践》学习笔记(第二章 中文文本分类(一))...
查看>>
python (ploit)
查看>>
Android 用achartengine 画折线图怎么显示不正确
查看>>
程序简单的测试与升级(暨实践第一次作业)
查看>>
信号处理
查看>>
【100题】第五十九题 用C++编写不能被继承的类
查看>>
轻描淡写
查看>>
mysql基本操作
查看>>
39.CSS3弹性伸缩布局【下】
查看>>
[javascript]图解+注释版 Ext.extend()
查看>>
我的前端工具集(七)div背景网格
查看>>
linux 下mongo 基础配置
查看>>
【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)...
查看>>
JUnit单元测试中的setUpBeforeClass()、tearDownAfterClass()、setUp()、tearDown()方法小结
查看>>
java之jvm学习笔记六(实践写自己的安全管理器)
查看>>