Go语言实践篇之MongoDB

Go语言中MongoDB的使用

关于MongoDB数据的基本介绍与环境搭建相关知识,可参见我的另一篇文章 文档数据库 MongoDB

环境准备

mgo简介
mgo(音mango)是MongoDB的Go语言驱动,它用基于Go语法的简单API实现了丰富的特性,并经过良好测试。
官方网站:http://labix.org/mgo

API文档

安装

go get gopkg.in/mgo.v2

快速上手

mgo简单操作步骤

  1. 导入mgo包
  2. 连接MongoDB服务
  3. 打开指定的数据库,获得一个Database对象(不存在则创建)
  4. 打开指定的集合,获得一个Collection对象(不存在则创建)
  5. 调用Collection对象的方法进行CRUD操作

以下创建一个名为test数据库,并创建一个名为people的集合

package main

import (
        "fmt"
        "log"
        // 导入相关包
        "gopkg.in/mgo.v2"
        "gopkg.in/mgo.v2/bson"
)

// 声明一个结构体
type Person struct {
        Name string
        Phone string
}

func main() {
        // 连接MongoDB服务
        session, err := mgo.Dial("127.0.0.1:27017")
        if err != nil {
             panic(err)
        }
        defer session.Close()

        // 设置session的模式,不是必需的
        session.SetMode(mgo.Monotonic, true)

        // DB()方法切换到相应的数据库,C()方法切换到相应的集合
        c := session.DB("test").C("people")

        // 插入两条数据,Insert方法中的参数是不定参
        err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
               &Person{"Cla", "+55 53 8402 8510"})

        if err != nil {
             log.Fatal(err)
        }

        result := Person{}
        // 条件查询,查询 name 为Ale的一条数据
        err = c.Find(bson.M{"name": "Ale"}).One(&result)
        if err != nil {
             log.Fatal(err)
        }

        fmt.Println("Phone:", result.Phone)
}

session 模式

  • Strong
    session 的读写一直向主服务器发起并使用一个唯一的连接,因此所有的读写操作完全的一致。

  • Monotonic
    session 的读操作开始是向其他服务器发起(且通过一个唯一的连接),只要出现了一次写操作,session 的连接就会切换至主服务器。由此可见此模式下,能够分散一些读操作到其他服务器,但是读操作不一定能够获得最新的数据。

  • Eventual
    session 的读操作会向任意的其他服务器发起,多次读操作并不一定使用相同的连接,也就是读操作不一定有序。session 的写操作总是向主服务器发起,但是可能使用不同的连接,也就是写操作也不一定有序。

CRUD操作

插入

使用Insert方法插入数据

c.Insert(&Person{"Ale",  "+55 53 8116 9639"}})

在MongoDB这种分布式的数据库中,ID并不是一个有序的整数,我们可以使用bson.NewObjectId()来手动创建一个新的ObjectId

c.Insert(&User{
    Id_:       bson.NewObjectId(),
    Name:      "Tracy Yu",
    Age:       31,
    JoinedAt:  time.Now(),
    Interests: []string{"Shoping", "TV"},
})

多条批量插入

var docs []interface{}
docs = append(docs, doc1)
docs = append(docs, doc2)
col.Insert(docs...)

删除

使用Remove方法删除单条数据,使用RemoveAll方法删除所有的

删除指定条件的数据

c.Remove(bson.M{"name": "Jimmy Kuu"})

修改

使用Update方法修改数据,如需更新所有的则可用UpdateAll() 方法

  • 修改字段值($set)

    c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, 
    	bson.M{"$set": bson.M{ "name": "Jimmy Gu", "age": 34, }})
    
  • 增加字段值($inc)

    c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, 
    	bson.M{"$inc": bson.M{ "age": -1, }})
    
  • 增加一个数组元素($push)

    c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, 
    	bson.M{"$push": bson.M{ "interests": "Golang", }})
    
  • 删除一个数组元素($pull)

    c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, 
    	bson.M{"$pull": bson.M{ "interests": "Golang", }})
    

查询

使用Collection对象的Find()方法查询,并调用过滤方法返回结果

  • 无条件查询
    All()方法可以获得所有结果,One()只返回一个结果

    c.Find(nil).All(&users)
    
  • 条件查询
    条件查询使用bson.M{key: value}

    c.Find(bson.M{"name":  "Ale"}).One(&result)
    

    根据ObjectId查询

    c.FindId(objectId).One(&user)
    
  • 多条件查询

    • and($and) 同时满足多个条件
    c.Find(bson.M{"name": "Jimmy Kuu", "age": 33}).All(&users)
    
    • or($or) 多个条件中满足一个
    c.Find(bson.M{"$or": []bson.M{bson.M{"name": "Jimmy Kuu"}, bson.M{"age": 31}}}).All(&users)
    
  • 其他

    • 查询集合中的元素总数

      countNum, err := collection.Count()
      
    • 返回可迭代的结果

        iter := collection.Find(nil).Iter()
        for iter.Next(&result) {
            fmt.Printf("Result: %v\n", result.NAME)
        }
      

字段映射

使用结构体来插入数据时,会自动根据结构体字段名来生成数据库字段,但由于Go语言要求结构体字段的首字母大写才能访问,当结构体中的字段定义与数据库字段无法一致时,则可以使用Go语言的结构体Tag特性进行字段映射解决该问题。

结构体Tag类似于Java中的注解,使用反引号括起来,这里通过字段映射直接指定数据库中的字段

// 其中 bson 后面对应的字段为数据库中要生成的字段
type person struct {
    AGE    int    `bson:"age"`
    NAME   string `bson:"name"`
    HEIGHT int    `bson:"height"`
}

欢迎关注我的公众号:编程之路从0到1

编程之路从0到1

Go语言从入门到构建自己的区块链

02-10
区块链,是一个分布式的共享账本和数据库,具有去中心化、不可篡改、可追溯、公开透明等特点。区块链技术作为科技创新的代表和未来技术的发展方向,已经上升至国家战略高度。它将为解决信息不对称问题、创造信任与合作机制等提供丰富的应用空间,也会是未来我们技术自主创新、引领产业变革的重要突破口。 比特币被认为是区块链技术1.0版的应用,主要实现的是电子现金的分布式记账转账功能。而随着技术的不断发展更新,越来越多的人希望突破“账本”的限制,从而可以把这项未来技术应用在更广阔的领域。 以太坊(Ethereum)为代表的第二代区块链公链项目,就是其中的佼佼者。与比特币不同,以太坊的定位是一个“世界计算机”。以区块链作为底层存储技术,我们不仅可以记账转账,而且可以构建“智能合约”(smart contract)定义程序化的处理流程,进而实现区块链上运行的“去中心化应用”(DApp)。 以太坊项目自提出后就受到了广泛关注,快速发展和壮大,而且由于其“分布式应用平台”而非“分布式账本”的定位,越来越多的开发人员开始以以太坊为基础设施,在上面开发DApp。 随着更多开发人员的参与,和项目的逐步落地,以太坊已成为从事区块链学习和开发不可或缺的一个环节;既了解区块链底层原理、又熟悉以太坊架构、还能基于以太坊开发DApp的专业人才,也成为了各大公司发力区块链技术储备的重点对象。 01.Go语言核心技术 性能卓越的Go语言已被全球知名公司谷歌、亚马逊、阿里、京东等广泛用于区块链、云计算开发。当前互联网行业正向虚拟现实和人工智能时代迈进,对于Golang人才的需求越加紧迫。 本套Go语言经典教程,不仅系统讲解了Go语言核心技术,还深入剖析了Go语言编程思想和底层实现。通过系统全面的学习,让你快速掌握Go语言关键技术,具备真正的Golang开发经验,并为下一步学习区块链技术打下坚实基础。 02.GoWeb 本套课程从GoWeb基础讲起,并配有实战案例,内容包含:Web简介、使用Go搭建服务器、使用Go对数据库进行增删改查、使用 Go处理请求和响应以及Go的模板引擎等。 实战案例的功能模块包括:登录注册、图书的增删改查、分页、购物车、订单管理等。 03.区块链以太坊核心技术 本套课程对以太坊基础理论知识和架构做了系统的梳理和深入的阐述,并对solidity和DApp的开发做了系统讲解,另外还对以太坊白皮书、黄皮书做了介绍;为有志于学习区块链技术、了解以太坊底层架构和DApp开发原理的工程师提供学习平台和帮助。 教程内容分为五大部分:以太坊基础、以太坊原理和架构、以太坊编程及应用、合约工作流以及原理深入分析。 通过学习本套课程,可以使学习者对以太坊有充分的认识,对整个区块链技术有更深刻的理解,对区块链应用开发有更加整体的领悟。 04.区块链项目:投票系统 课程基于以太坊开发投票系统DApp,在基础投票功能的基础上,增加了基于自定义token进行投票的功能,另外还涉及到了以太坊开发框架truffle的使用。 通过一个完整的DApp的开发,将以太坊理论和实践紧密结合起来,可以使学习者对以太坊上的DApp开发有更加全面充分的认识,进而对整个区块链技术有更深刻的理解。 05.区块链项目:拍卖系统 课程基于以太坊开发拍卖系统DApp,拍卖的原理类似于eBay,所以又可以叫做“去中心化eBay”项目。课程对项目的整体架构、后台合约逻辑、前台页面设计和实现一一做了详细讲解。 由于需要将商品信息保存在区块链上,所以我们会引入另一个区块链项目IPFS作为基础设施,另由于链下产品的存取,还会涉及到MongoDB。所有涉及到的组件及其交互,我们都会进行专项讲解。 通过完整的拍卖平台DApp的开发,可以使学习者对以太坊上的DApp开发有更加全面充分的认识,也可以了解到区块链系统与其它组件的交互,进而更加深刻地理解项目架构,为将来成长为架构师打下基础。
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值