详解Golang使用MongoDB通用操作

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 string
switch 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使用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代替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通用操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mongodb官方的golang驱动基础使用教程分享

    前言 mongo数据库在nodejs平台有2个常用驱动,mongodb和mongoose,mongodb接口非常接近mongo数据库原生的操作方式,是helloworld之类演示代码的首选mongo数据库连接驱动,因此成为大部分nodejs初学者最先接触的mongo数据库驱动.初学者在学会mongo连接的同时,却也可悲的被helloword这种演示性质的数据库操作习惯潜移默化了. 本文主要介绍的是关于mongodb官方的golang驱动使用的相关内容,下面话不多说了,来一起看看详细的介绍吧 使用

  • Golang对MongoDB数据库的操作简单封装教程

    前言 Golang 对MongoDB的操作简单封装 使用MongoDB的Go驱动库 mgo,对MongoDB的操作做一下简单封装 mgo(音mango)是MongoDB的Go语言驱动,它用基于Go语法的简单API实现了丰富的特性,并经过良好测试. 初始化 操作没有用户权限的MongoDB var globalS *mgo.Session func init() { s, err := mgo.Dial(dialInfo) if err != nil { log.Fatalf("Create Se

  • golang操作mongodb的方法

    本文实例讲述了golang操作mongodb的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "fmt"     "launchpad.net/mgo"     "launchpad.net/mgo/bson" ) type Mail struct {     Id bson.ObjectId "_id"     Name string     Emai

  • Golang Mongodb模糊查询的使用示例

    前言 在日常使用的Mongodb中,有一项功能叫做模糊查询(使用正则匹配),例如: db.article.find({"title": {$regex: /a/, $options: "im"}}) 这是我们常用Mongodb的命令行使用的方式,但是在mgo中做出类似的方式视乎是行不通的: query := bson.M{"title": bson.M{"$regex": "/a/", "$opt

  • golang 连接mongoDB的方法示例

    Mogondb 不支持事务.所有有事务要求的需求慎用,比如银行的转账操作慎用,转1个亿美金,因为网络,电力的故障导致交易没有完成,不能回滚,交易无法撤回.所有慎用!! Mogondb 的应用场景: 比如一篇CSDN博客,博客内容,博客作者,发布时间,评论,阅读量等信息可以将这些信息存储到一个类似JSON数据中.如果用mysql需要将不同的信息分别存储于不同的表中,使用的时候,查询多表或者使用JOIN查询数据,导致查询过慢.而使用MongoDB,将数据存储在一起,需要数据时,一次就能查询到数据.更

  • 详解Golang使用MongoDB通用操作

    MongoDB是Nosql中常用的一种数据库,今天笔者就简单总结一下Golang如何使用这些通用的供能的,不喜勿喷...        研究的事例结构如下: type LikeBest struct { AuthorName string `bson:"authorname,omitempty"` BookName string `bson:"bookname,omitempty"` PublishTime string `bson:"publishtim

  • 详解Golang五种原子性操作的用法

    目录 Go 语言提供了哪些原子操作 互斥锁跟原子操作的区别 比较并交换 atomic.Value保证任意值的读写安全 总结 本文我们详细聊一下Go语言的原子操作的用法,啥是原子操作呢?顾名思义,原子操作就是具备原子性的操作... 是不是感觉说了跟没说一样,原子性的解释如下: 一个或者多个操作在 CPU 执行的过程中不被中断的特性,称为原子性(atomicity) .这些操作对外表现成一个不可分割的整体,他们要么都执行,要么都不执行,外界不会看到他们只执行到一半的状态. CPU执行一系列操作时不可

  • 详解Golang中的各种时间操作

    需求 时间格式的转换比较麻烦,自己写了个工具,可以通过工具中的这些方法相互调用转成自己想要的格式,代码如下,后续有新的函数再添加 实现代码 package utils import "time" const ( TIMEFORMAT = "20060102150405" NORMALTIMEFORMAT = "2006-01-02 15:04:05" ) // 当前时间 func GetTime() time.Time{ return time.

  • 一文详解Golang 定时任务库 gron 设计和原理

    目录 cron 简介 gron 定时参数 源码解析 Cron Entry 按照时间排序 新增定时任务 启动和停止 Schedule 扩展性 经典写法-控制退出 结语 cron 简介 在 Unix-like 操作系统中,有一个大家都很熟悉的 cli 工具,它能够来处理定时任务,周期性任务,这就是: cron. 你只需要简单的语法控制就能实现任意[定时]的语义.用法上可以参考一下这个Crontab Guru Editor,做的非常精巧. 简单说,每一个位都代表了一个时间维度,* 代表全集,所以,上面

  • 详解Golang中Context的原理和使用技巧

    目录 Context 背景 和 适用场景 Context 的背景 Context 的功能和目的 Context 的基本使用 Context 的同步控制设计 Context 的定义和实现 Context interface 接口定义 parent Context 的具体实现 Context 的继承和各种 With 系列函数 Context 的常用方法实例 1. 调用 Context Done方法取消 2. 通过 context.WithValue 来传值 3. 超时取消 context.WithT

  • 详解Golang 与python中的字符串反转

    详解Golang 与python中的字符串反转 在go中,需要用rune来处理,因为涉及到中文或者一些字符ASCII编码大于255的. func main() { fmt.Println(reverse("Golang python")) } func reverse(src string) string { dst := []rune(src) len := len(dst) var result []rune result = make([]rune, 0) for i := le

  • 详解Golang中Channel的用法

    如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制.一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息. 1 创建channel 每个channel都有一个特殊的类型,也就是channels可发送数据的类型.一个可以发送int类型数据 的channel一般写为chan int.使用内置的make函数,如果第二个参数大于0,则表示创建一个带缓存的channel. ch := make(chan in

  • 详解关于Dbeaver的常用操作

    dbeaver是免费和开源(GPL)为开发人员和数据库管理员通用数据库工具. 在开发过程中能够极大的提升我们的工作效率,下面我把我日常使用到的功能描述一下: 1:与plsql相比,Dbeaver没有右击直接查看表注释的功能,但是Dbeaver提供了一个"打开声明"的功能,里面可以查看一些比较实用的内容:表列注释.创建该表的create语句: 2:在一般开发的情况下,往往需要查询的数据条数不会那么地多,要求查询速度响应快,为了使Dbeaver查询速度更快,所以可以设置每次查询数据返回的条

  • 详解Golang Iris框架的基本使用

    Iris介绍 编写一次并在任何地方以最小的机器功率运行,如Android.ios.Linux和Windows等.它支持Google Go,只需一个可执行的服务即可在所有平台. Iris以简单而强大的api而闻名. 除了Iris为您提供的低级访问权限. Iris同样擅长MVC. 它是唯一一个拥有MVC架构模式丰富支持的Go Web框架,性能成本接近于零. Iris为您提供构建面向服务的应用程序的结构. 用Iris构建微服务很容易. 1. Iris框架 1.1 Golang框架   Golang常用

  • 详解golang中的method

    什么是method(方法)?method是函数的另外一种形态,隶属于某个类型的方法. method的语法: func (r Receiver) funcName (parameters) (result) receiver可以看作是method的第一个参数,method并且支持继承和重写. Go中虽没有class,但依旧有method 通过显示说明receiver来实现与某个类型的结合 只能为同一个包中的类型定义方法 receiver可以是类型的值或者指针 不存在方法重载 可以使用值或指针来调用

随机推荐