golang mongodb 驱动二次封装
mongodb 官方的go驱动包 go.mongodb.org/mongo-driver 使用起来比较繁琐,最近对其进行了二次封装
github地址:https://github.com/w3liu/go-common/tree/master/store/mongo
测试用例如下:
func TestFindOne(t *testing.T) {
col := &demoCollection{}
filter := bson.D{
{"title", "什么是Lambda架构"},
}
opt := options.FindOne().SetSort(bson.D{{"_id", -1}})
finder := NewOneFinder(col).Where(filter).Options(opt)
b, err := store.FindOne(context.TODO(), finder)
if err != nil {
t.Fatal(err)
}
t.Log("b", b)
t.Logf("%#v", col)
}
func TestFindMany(t *testing.T) {
col := &demoCollection{}
filter := bson.D{
//{"title", "什么是Lambda架构"},
}
opt := options.Find().SetSort(bson.D{{"_id", -1}})
records := make([]*demoCollection, 0)
finder := NewFinder(col).Where(filter).Options(opt).Records(&records)
err := store.FindMany(context.TODO(), finder)
if err != nil {
t.Fatal(err)
}
for _, item := range records {
t.Log(item)
}
}
func TestInsertOne(t *testing.T) {
err := store.InsertOne(context.TODO(), defaultCollection)
if err != nil {
t.Fatal(err)
}
t.Log("id", defaultCollection.Id.Hex())
}
func TestDeleteOne(t *testing.T) {
id, _ := primitive.ObjectIDFromHex("5f6183a9ed076ced7eacec3a")
col := &demoCollection{
Id: id,
}
cnt, err := store.DeleteOne(context.TODO(), col)
if err != nil {
t.Fatal(err)
}
t.Log("cnt", cnt)
}
func TestUpdateOne(t *testing.T) {
id, _ := primitive.ObjectIDFromHex("5f618414c978e349ced0c81f")
col := &demoCollection{
Id: id,
}
filter := bson.D{
{"_id", id},
}
update := bson.D{
{"title", "什么是Lambda架构?"},
}
updater := NewUpdater(col).Where(filter).Update(update)
cnt, err := store.UpdateOne(context.TODO(), updater)
if err != nil {
t.Fatal(err)
}
t.Log("cnt", cnt)
}
func TestInsertMany(t *testing.T) {
cols := make([]*demoCollection, 0)
title := defaultCollection.Title
for i := 0; i < 10; i++ {
item := &demoCollection{
Title: fmt.Sprintf("%s_%d", title, i),
Author: defaultCollection.Author,
Content: defaultCollection.Content,
Status: 1,
CreatedAt: time.Now(),
}
cols = append(cols, item)
}
docs := make([]interface{}, 0)
for i := 0; i < len(cols); i++ {
docs = append(docs, cols[i])
}
err := store.InsertMany(context.TODO(), docs)
if err != nil {
t.Fatal(err)
}
for i := 0; i < len(cols); i++ {
t.Log("id", cols[i].GetId())
t.Log("title", cols[i].Title)
}
}
func TestDeleteMany(t *testing.T) {
//filter := bson.D{
// {"title", "什么是Lambda架构"},
//}
deleter := NewDeleter(defaultCollection).Where(nil)
cnt, err := store.DeleteMany(context.TODO(), deleter)
if err != nil {
t.Fatal(err)
}
t.Log("cnt", cnt)
}
func TestUpdateMany(t *testing.T) {
filter := bson.D{
{"author", "数据社"},
}
update := bson.D{
{"title", "什么是Lambda架构"},
}
updater := NewUpdater(defaultCollection).Where(filter).Update(update)
cnt, err := store.UpdateMany(context.TODO(), updater)
if err != nil {
t.Fatal(err)
}
t.Log("cnt", cnt)
}
func TestAggregate(t *testing.T) {
var records []*struct {
Total int `bson:"total"`
Count int `bson:"count"`
}
match := bson.D{
{"$match", bson.D{
{"author", "数据社1"},
}},
}
group := bson.D{
{"$group", bson.D{
{"_id", nil},
{"total", bson.M{"$sum": "$status"}},
{"count", bson.M{"$sum": 1}},
}},
}
aggregator := NewAggregator(defaultCollection).Stage(match).Stage(group).Records(&records)
err := store.Aggregate(context.TODO(), aggregator)
if err != nil {
t.Fatal(err)
}
if len(records) > 0 {
t.Log(records[0])
}
}
func TestCountDocuments(t *testing.T) {
//filter := bson.D{
// {"author", "数据社1"},
//}
counter := NewCounter(defaultCollection).Where(nil)
cnt, err := store.CountDocuments(context.TODO(), counter)
if err != nil {
t.Fatal(err)
}
t.Log("cnt", cnt)
}
func TestCountEstimateDocuments(t *testing.T) {
counter := NewEstimateCounter(defaultCollection)
cnt, err := store.CountEstimateDocuments(context.TODO(), counter)
if err != nil {
t.Fatal(err)
}
t.Log("cnt", cnt)
}
golang mongodb 驱动二次封装的更多相关文章
- python mysql redis mongodb selneium requests二次封装为什么大都是使用类的原因,一点见解
1.python mysql redis mongodb selneium requests举得这5个库里面的主要被用户使用的东西全都是面向对象的,包括requests.get函数是里面每次都是实例 ...
- 简单二次封装的Golang图像处理库:图片裁剪
简单二次封装的Golang图像处理库:图片裁剪 一.功能 Go语言下的官方图像处理库 简单封装后对jpg和png图像进行缩放/裁剪的库 二.使用说明 1.首先下载 go get -v -u githu ...
- 安装golang的mongodb驱动mgo速记
这里介绍的方法只适用于Centos平台,测试版本为centos 6.5 下载源码安装实在麻烦,这里采用比较简单的方法给GO安装mongodb驱动 安装mgo之前,需要先安装bzr yum -y ins ...
- MongoDB学习笔记~自己封装的Curd操作(查询集合对象属性,更新集合对象)
回到目录 我不得不说,mongodb官方驱动在与.net结合上做的不是很好,不是很理想,所以,我决定对它进行了二次封装,这是显得很必然了,每个人都希望使用简单的对象,而对使用复杂,麻烦,容易出错的对象 ...
- Mongodb for .Net Core 封装类库
一:引用的mongodb驱动文件版本为 Mongodb.Driver 20.4.3 二:我只是进行了常用方法的封装,如有不当之处,请联系我 创建mongodb的连接 using MongoDB.Bso ...
- VS2017 + Windows10编译C++ MongoDB驱动
转载地址:https://blog.csdn.net/sqcfj/article/details/86716831 mongoDB有两个接口库:mongo-c-driver和mongo-cxx-dri ...
- Golang+Mongodb
Golang+Mongodb打造你的第一个站点 很多人推荐MEAN来开发站点.MEAN就是M:mongodb,E:expressjs.A:angular最后的N:nodejs. 但是如果你亲身的体会到 ...
- .Net Framework下对Dapper二次封装迁移到.Net Core2.0遇到的问题以及对Dapper的封装介绍
今天成功把.Net Framework下使用Dapper进行封装的ORM成功迁移到.Net Core 2.0上,在迁移的过程中也遇到一些很有意思的问题,值得和大家分享一下.下面我会还原迁移的每一个过程 ...
- Selenium二次封装-Java版本
package com.yanfuchang.selenium.utils; import java.awt.AWTException; import java.awt.Robot; import j ...
随机推荐
- Python enumerate():使用计数器简化循环
摘要:当您需要计数和迭代中的值时,Pythonenumerate()允许您编写 Pythonicfor循环.最大的优点enumerate()是它返回一个带有计数器和值的元组,因此您不必自己增加计数器. ...
- 如何推翻JAVA的统治地位
"java越来越过份了."php狠狠的说,他转头看着C:"C哥,您可是前辈,java最近砸了我不少场子,你老再不出来管管,我怕他眼里就没有您了啊." C哥吸烟, ...
- InnoDB学习(四)之RedoLog和UndoLog
BinLog是MySQL Server层的日志,所有的MySQL存储引擎都支持BinLog.BinLog可以支持主从复制和数据恢复,但是对事务的ACID特性支持比较差.InnoDB存储引擎引入Redo ...
- [BUUCTF]REVERSE——[BJDCTF2020]JustRE
[BJDCTF2020]JustRE 附件 步骤: 例行查壳儿,无壳儿,32位程序 32位ida载入,main函数没看懂,shift+f12检索了一下程序里的字符串,发现了一个类似于flag的字符串 ...
- ciscn_2019_s_3 一道收获很多的题(进步大只能说明基础差)
32位与64位 系统调用的区别: 1. 传参方式不同 2. 系统调用号 不同 3. 调用方式 不同 32位: 传参方式:首先将系统调用号 传入 eax,然后将参数 从左到右 依次存入 ebx,ecx, ...
- [BUUCTF]REVERSE——不一样的flag
不一样的flag 附件 步骤 例行查壳儿,32位程序,无壳儿 32位ida载入,shift+f12检索程序里的字符串,看到了如图标记的字符串,加上下面又上下左右的选项,估计是道迷宫类型的题目 将迷宫字 ...
- 为什么没有APS排产的MES是没有灵魂的?
ERP系统在于对整个企业与集团企业间的全面管控,APS系统是生产规划及排程系统,MES系统重点在于车间现场的管理,下面用最简单方式讲讲ERP系统.APS系统和MES系统之间的区别与联系. 没有APS计 ...
- AT266 迷子のCDケース 题解
Content 有 \(n+1\) 个碟,编号为 \(0\sim n\),一开始 \(0\) 号碟在播放机上,其他的碟依次放进了 \(n\) 个盒子里面.现在有 \(m\) 次操作,每次操作找到当前在 ...
- 基于nginx的rtmp直播服务器(nginx-rtmp-module实现)
首先,在搭建服务之前先了解下目前主流的几个直播协议: 1.RTMP: 实时消息传输协议,Real Time Messaging Protocol,是 Adobe Systems 公司为 Flash 播 ...
- 使用.NET 6开发TodoList应用(5.1)——实现Repository模式
需求 经常写CRUD程序的小伙伴们可能都经历过定义很多Repository接口,分别做对应的实现,依赖注入并使用的场景.有的时候会发现,很多分散的XXXXRepository的逻辑都是基本一致的,于是 ...