Go与MongoDB
go没有类这一概念,对于变量的捆绑都是由键值对形式的结构体(struct)实现的。
这对同样是以键值对形式存储的mongodb以及json都非常友好。所以在go中,并不是很依赖建立在mongodb之上的orm,使用比较底层的驱动级的接口即可方便的进行操作。
本篇文章将以商品(goods)为例,简单讲解如何使用mgo进行简单的增删改查操作。
mgo
mgo (pronounced as mango) is a MongoDB driver for the Go language that implements a rich and well tested selection of features under a very simple API following standard Go idioms.
打开终端输入
go get gopkg.in/mgo.v2
在当前pkg下新建goods.go文件, 对mgo提供的接口进行一些封装:
func connect(cName string) (*mgo.Session, *mgo.Collection) {
session, err := mgo.Dial("$mongoHost") //Mongodb's connection
if err != nil {
panic(err)
}
session.SetMode(mgo.Monotonic, true)
//return a instantiated collect
return session, session.DB(mongoDB).C(cName)
}
定义goods实例:
type Goods struct {
ID string
Name string
Price string
Url string
}
接下来我们要存入第一条记录:
func (a *Goods) save() error {
s, c := connect("goods")
defer s.Close()
a.ID = bson.NewObjectId().Hex()
return c.Insert(&a)
}
特别注意: 如果在定义时将ID的类型定义为 bson.ObjectID
,并指定bson标签为_id
,mongodb将不会为它分配新的id。但是这样的结构在与json做交互时不是很方便。
在做记录的查询时,需要新建一个同类型的结构体或结构体数组,然后执行Find
操作,如果参数为空,则返回全部记录:
func (a Goods) all() ([]Goods, error) {
s, c := connect("goods")
defer s.Close()
var group []Goods
err := c.Find(nil).All(&group)
return group, err
}
func (a *Goods) get(id string) error {
s, c := connect("goods")
defer s.Close()
return c.Find(bson.M{"id": id}).One(&a)
}
如果你熟悉mongodb的操作,可以看出,这样的操作与直接在shell内操作几乎相同。
删除:
func (a Goods) delete() error {
s, c := connect("goods")
defer s.Close()
return c.Remove(bson.M{"id": a.ID})
}
更新:
func (a *Goods) update() error {
s, c := connect("goods")
defer s.Close()
c.Update(bson.M{"id": a.ID}, a)
return a.get(a.ID)
}
推荐阅读
Vue-apollo — 在Vue-cli项目中使用Graphql
Vue-apollo — 在Vue-cli项目中使用Graphql Vue-apollo — Integrates apollo in your Vue components with declarative queries. 当然我们可以通过直接在url中携带参数直接请求,这样太过麻烦。vue-apollo为我们提...
myWsq赞 5阅读 10.5k评论 1
硬卷完了!MongoDB 打怪升级进阶成神之路( 2023 最新版 )!
前面我们学习:MySQL 打怪升级进阶成神之路、Redis 打怪升级进阶成神之路,然后我们还在继续 NoSQL 的卷王之路。从第一篇文章开始,我们逐步详细介绍了 MogoDB 基础概念、安装和最基本的CURD操作、索引和聚合、工...
民工哥赞 6阅读 580
「刷起来」Go必看的进阶面试题详解
逃逸分析是Go语言中的一项重要优化技术,可以帮助程序减少内存分配和垃圾回收的开销,从而提高程序的性能。下面是一道涉及逃逸分析的面试题及其详解。
王中阳Go赞 4阅读 1.9k评论 1
初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。
王中阳Go赞 4阅读 1.7k评论 2
又一款眼前一亮的Linux终端工具!
今天给大家介绍一款最近发现的功能十分强大,颜值非常高的一款终端工具。这个神器我是在其他公众号文章上看到的,但他们都没把它的强大之处介绍明白,所以我自己体验一波后,再向大家分享自己的体验。
良许赞 5阅读 1.8k
一分钟搞明白!快速掌握 Go WebAssembly
最近因为各种奇怪的原因,更多的接触到了 WebAssembly。虽然之前很多博客也翻过写过各种文章,但总感觉欠些味道。于是今天梳理了一版,和大家一起展开学习。
煎鱼赞 4阅读 2.2k
面试官:请说一下如何优化结构体的性能?
使用内存对齐机制优化结构体性能,妙啊!前言之前分享过2篇结构体文章:10秒改struct性能直接提升15%,产品姐姐都夸我好棒 和 Go语言空结构体这3种妙用,你知道吗? 得到了大家的好评。这篇继续分享进阶内容:结...
王中阳Go赞 4阅读 3.8k评论 2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。