Go实现Json转Bson存入Mongo

Go实现Json转Bson存入Mongo

业务场景:

搞了个大作业,里面的话我们需要将前端传过来的Json直接存入到Mongo方便后面直接取出来分析。然后我看了很多Go语言操作MongoDB实现增删改查的文档,但是需要转为对应的结构体然后存入,但是我们这个Json的结构体没法固定,另辟蹊径吧,就有了以下操作(悄悄水一篇)

代码实现

以下的代码实现了增与查

package common

import (
	"context"
	"encoding/json"
	"errors"
	"time"

	"go.mongodb.org/mongo-driver/bson/primitive"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"gopkg.in/mgo.v2/bson"
)

var (
	MongoPool *MongoDb // 对外暴露
)

type MongoDb struct {
	connection *mongo.Collection
}

func NewMongoDbPool() (*MongoDb, error) { // 创建实例化
	pool, err := ConnectToDB()
	if err != nil {
		return nil, err
	}
	return &MongoDb{
		connection: pool,
	}, nil
}

// ConnectToDB 与mongo创建连接
func ConnectToDB() (*mongo.Collection, error) {
	url := ""                      // mongo连接配置URL
	name := ""                     // 名字
	collection := ""               // 集合
	maxCollection := 10            // 最大连接数
	var timeout time.Duration = 10 // 设置10秒的超时时间
	ctx, cancel := context.WithTimeout(context.Background(), timeout)
	defer cancel()
	o := options.Client().ApplyURI(url)
	o.SetMaxPoolSize(uint64(maxCollection))
	client, err := mongo.Connect(ctx, o)
	if err != nil {
		return nil, err
	}
	return client.Database(name).Collection(collection), nil // 返回的连接直接对应的是集合
}

func (m *MongoDb) jsonStr2Bson(str string) (interface{}, error) {
	var want interface{}
	err := bson.UnmarshalJSON([]byte(str), &want)
	if err != nil {
		return nil, err
	}
	return want, nil
}

// InsertToDb 直接插入Json字段
func (m *MongoDb) InsertToDb(wantStr string) (string, error) {
	if wantStr == "" {
		return "", errors.New("转换的字符串为空")
	}
	want, err := m.jsonStr2Bson(wantStr)
	if err != nil {
		return "", err
	}
	res, err := m.connection.InsertOne(context.TODO(), want)
	if err != nil {
		return "", err
	}
	id, ok := res.InsertedID.(primitive.ObjectID)
	if !ok {
		return "", errors.New("断言错误")
	}
	return id.Hex(), nil
}

// FindInfoByField 通过字段与KEY进行查询
func (m *MongoDb) FindInfoByField(field, want string) (string, error) {
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()
	filter := bson.M{field: want}
	cursor, err := m.connection.Find(ctx, filter)
	if err != nil {
		return "", err
	}
	defer cursor.Close(ctx)
	var temp []bson.M
	if err = cursor.All(context.Background(), &temp); err != nil {
		return "", err
	}
	if len(temp) == 0 {
		return "", nil
	}
	jsonInfo, err := json.Marshal(temp)
	if err != nil {
		return "", err
	}
	return string(jsonInfo), nil
}

// FindInfoById 通过Mongo自己的ID进行查询
func (m *MongoDb) FindInfoById(id string) (string, error) {
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	objID, _ := primitive.ObjectIDFromHex(id)
	filter := bson.M{"_id": objID}
	cursor, err := m.connection.Find(ctx, filter)
	if err != nil {
		return "", err
	}
	defer cursor.Close(ctx)
	var temp []bson.M
	if err = cursor.All(context.Background(), &temp); err != nil {
		return "", err
	}
	if len(temp) == 0 {
		return "", nil
	}
	jsonInfo, err := json.Marshal(temp[0])
	if err != nil {
		return "", err
	}
	return string(jsonInfo), nil
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Delphi编写的例子中,引用展示了将JSON换为BSON的代码。在这个例子中,函数TMyMongoDbClass.JsonToBson接受两个参数,一个是JSON字符串,一个是tjsonvalue类型的对象。函数内部通过递归的方式将JSON中的各个字段换为对应的BSON字段。在函数BL_json中,通过判断tobj的类型进行相应的处理,将JSON中的值换为BSON中的值。最后,通过调用curbuf.finishObject完成BSON对象的构建。 另外,在使用QT编写的例子中,引用提到了可以使用QT自带的JSON引擎来解析JSON,并将其换为QJsonDocument,然后再将其换为BSON。 因此,无论是使用Delphi还是QT,都可以实现JSON换为BSON的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [json如何换为bson](https://blog.csdn.net/diaowojian9497/article/details/102292958)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [json_bson.zip](https://download.csdn.net/download/halo_hsuh/12284550)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值