golang mongodb 驱动二次封装

Posted 山分子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 驱动二次封装的主要内容,如果未能解决你的问题,请参考以下文章

关于 Golang 的 Mongodb 驱动程序的 Mongodb 查询

用golang的mgo驱动,mongodb时区怎么设置,总是慢8小时

简单二次封装的Golang图像处理库:图片裁剪

MongoDB Golang驱动mgo的连接池使用问题

在golang中使用mongodb官方驱动用ID查询的一个小坑

在 Golang 中动态创建 MongoDB Pipeline