- Qmgo
最近,七牛研发团队开源了一款更好用的Go语言的MongoDB driver,Qmgo:
https://github.com/qiniu/qmgogithub.com它基于MongoDB官方 mongodb/mongo-go-driver 实现,但是有着更好的易用性,设计上参考了老牌的driver Mgo: go-mgo/mgo(比如Mgo的链式调用)。
- 背景
做Qmgo的初衷,来自于使用MongoDB的gopher们共同的困扰,在MongoDB的Go官方driver成型前(v1.0.0发布在2019年3月),一直是Mgo一统江湖,出色的接口设计让其非常流行。七牛做为最早使用Go的公司之一,自然也是Mgo的深度用户。
但是Mgo已经在3年前不再维护,bug不修复,MongoDB的新特性自然也无法支持,而官方driver的接口设计是出名的不易用。
这样的背景下,基于满足下面的需求,Qmgo诞生了
- 想要MongoDB新特性
- 想要更稳定的driver
- 想要Mgo出色的接口设计
- 想要从Mgo迁移到Qmgo,代码改动最小
下面,简单介绍一下Qmgo的特点,详情可以点击查看:qiniu/qmgo
- 好用在哪里?
举一个多文件查找、sort和limit的例子, 说明qmgo和mgo的相似,以及对官方driver的改进之处
官方Driver需要这样实现
// go.mongodb.org/mongo-driver
// find all 、sort and limit
findOptions := options.Find()
findOptions.SetLimit(7) // set limit
var sorts D
sorts = append(sorts, E{Key: "weight", Value: 1})
findOptions.SetSort(sorts) // set sort
batch := []UserInfo{}
cur, err := coll.Find(ctx, bson.M{"age": 6}, findOptions)
cur.All(ctx, &batch)
Qmgo和mgo更简单,而且实现相似:
// qmgo
// find all 、sort and limit
batch := []UserInfo{}
cli.Find(ctx, bson.M{"age": 6}).Sort("weight").Limit(7).All(&batch)
// mgo
// find all 、sort and limit
coll.Find(bson.M{"age": 6}).Sort("weight").Limit(7).All(&batch)
- 当前支持的功能
- 文档的增删改查
- Sort、limit、count、select、distinct
- 事务
- Hooks
- 自动化更新的默认和定制fields
- 预定义操作符
- 聚合Aggregate、索引操作、cursor
- 创建链接时支持配置: 连接池、pool Monitor、Auth、ReadPreference
- 使用方法
欢迎大家去readme查看具体的使用方法,体验Qmgo的诸多强大功能:qiniu/qmgo