golang基础学习-MongoDB使用

news/2024/11/14 10:17:29

1.系统环境

  • Golang:go version go1.10.3 darwin/amd64
  • OS:MacOS
  • MongoDB: version: 3.4.4

2.Golang使用MongoDB

使用:gopkg.in/mgo.v2

  获取包:go get gopkg.in/mgo.v2
  引入:import "gopkg.in/mgo.v2"

mgo简介

3.简单使用MongoDB

3.1 数据设计

3.1.1 数据库设计:

数据库名:mydb_tutorial
集合名: t_student

数据集合:t_student字段说明

字段类型说明
namestring姓名
ageint年龄
sidstring学号
statusint状态:1正常,9,删除

3.1.2结构体设计:

type Student struct {
    Name   string  `bson: "name"`
    Age    int     `bson: "age"`
    Sid    string  `bson: "sid"`
    Status int     `bson: "status"`
}

type Per struct {
    Per   []Student
}

mgo简介

func Dial(url string) (*Session, error)

官方简介:Dial establishes a new session to the cluster identified by the given seed server(s).

3.2 插入数据


    mongo, err := mgo.Dial("127.0.0.1") // 建立连接 

    defer mongo.Close()

    if err != nil {
        return false
    }

    client := mongo.DB("mydb_tutorial").C("t_student")  //选择数据库和集合

    //创建数据
    data := Student{
        Name:   "seeta",
        Age:    18,
        Sid:    "s20180907",
        Status: 1,
    }

    //插入数据
    cErr := client.Insert(&data)

    if cErr != nil {
        return false
    }
    return true

执行该段程序,MongoDB会出现一条记录:

clipboard.png

3.3 查找数据

在3.2插入数据的基础上,我们再插入一条数据:
data := Student{
        Name:   "seeta1",
        Age:    18,
        Sid:    "s20180908",
        Status: 1,
    }

3.3.1 findOne

mongo, err := mgo.Dial("192.168.0.91")

    defer mongo.Close()

    if err != nil {
        return false
    }

    client := mongo.DB("mydb_tutorial").C("t_student")

    user := Student{}
//查找sid为 s20180907
    cErr := client.Find(bson.M{"sid": "s20180907"}).One(&user)

    if cErr != nil {
        return false
    }

    fmt.Println(user)

    return true

执行该段程序,会打印查找到的结果:

{seeta 17 s20180907 1}

3.3.2 findAll

查找status为1的数据

mongo, err := mgo.Dial("192.168.0.91")

    defer mongo.Close()

    if err != nil {
        return false
    }

    client := mongo.DB("mydb_tutorial").C("t_student")

    //每次最多输出15条数据
    iter := client.Find(bson.M{"status": 1}).Sort("_id").Skip(1).Limit(15).Iter()

    var stu Student
    var users Per
    for iter.Next(&stu) {
        users.Per = append(users.Per, stu)
    }

    if err := iter.Close(); err != nil {
        return false
    }
    fmt.Println(users)
    return true

执行该段程序,会打印查找到的结果:

{[{seeta1 18 s20180908 1} {seeta 18 s20180907 1}]}

3.4 更新数据

更新数据前:
clipboard.png

    mongo, err := mgo.Dial("192.168.0.91")

    defer mongo.Close()

    if err != nil {
        return false
    }

    client := mongo.DB("mydb_tutorial").C("t_student")

    //只更新一条
    cErr := client.Update(bson.M{"status": 1}, bson.M{"$set": bson.M{"age": 20}})
    
    if cErr != nil {

        return false
    }

    return true
}

执行命令后:

clipboard.png
只更新了一条数据的年龄

如果我们想把所有status为1的学生年龄都更新为20.

用client.UpdateAll 替换client.Update 就可以了

3.5 删除数据

删除数据:sid为s20180907

    mongo, err := mgo.Dial("192.168.0.91")

    defer mongo.Close()

    if err != nil {
        return false
    }

    client := mongo.DB("mydb_tutorial").C("t_student")

    //只更新一条
    cErr := client.Remove(bson.M{"sid": "s20180907"})

    if cErr != nil {

        return false
    }

    return true

如果数据库设计的时候,有两个sid为s20180907 只会删除一条记录。
如果删除所有:用client.RemoveAll 替换client.Remove

4. 其他

写了一个gin和mgo结合的数据查询服务demo,细节可点击链接到github查看


http://www.niftyadmin.cn/n/3018946.html

相关文章

洛谷P2147[SDOI2008]洞穴勘测(lct)

题目描述 辉辉热衷于洞穴勘测。 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区。经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴。假如两个洞穴可以通…

Flink - Table API 之 window (窗口)

窗口 时间语义,要配合窗口操作才能发挥作用在Table API 和 SQL 中,主要有两种窗口 Group Window(分组窗口) 根据时间或行计数间隔,将行聚合到有限的组(Group)中,并对每个组的数据执行一次聚合函数 Over Windows 针对每个输入…

lwip 网络接口结构体 netif

2019独角兽企业重金招聘Python工程师标准>>> 在lwIP中,是通过结构体netif来描述一个硬件网络接口的,在单网卡中,这个结构体只有一个,多网卡中可有何网卡数目相同的netif结构体,它们构成一个数据链。 /** Ge…

嵌入式linux学习笔记-- linux下inotify的使用(转载)

原文地址:http://www.cnblogs.com/jimmychange/p/3498862.html 有时候我们需要检测某个目录下文件或者子目录的改动状况,如添加、删除、以及更新等,Linux系统上提供了inotify来完成这个功能。inotify是在版本2.6.13的内核中首次出现&#xff…

微信接口测试

""用于向指定用户发送消息前提: 1. 申请账号 "appid": wx65d37317efb972e0, "secret": f59dc1e2f5e3641145a213027fb122cc, 2. 知道用户的微信ID othEL0hlOrdBIRLLXuX0BA8frGZE"""import …

嵌入式linux学习笔记---TCP立即发出 以及 TCP的keep alive

事情的起因是公司的产品的某一个功能存在的bug,所以就有了本次的探索。 需求: 产品在某一个端口上 定时的向外发送1440 字节的数据包,该数据包包含了产品当前的各种状态。 需求2 : 产品本身绑定一个本地的端口 接收来自外部的字符…

Flink Sort-Shuffle写简析

文章目录1、配置2、初始创建3、成员变量4、写shuffle文件4.1、获取SortBuffer4.2、追加数据4.3、buffer不足的处理4.4、buffer不足数据未读完5、关于排序5.1、segment申请5.2、writeIndex5.2.1、获取当前可用segment5.2.2、写入index到segment5.2.3、更新partition最后数据的索…

Flink Sort-Shuffle读简析

文章目录1、SortMergeResultPartition的创建使用2、PartitionedFileReader2.1、moveToNextReadableRegion2.2、readCurrentRegion2.3、hasRemaining3、读操作的调用4、数据返回4.1、读入缓存4.2、buffersRead读取1、SortMergeResultPartition的创建使用 首先是一个读过程的一个…