golang使用mongo-driver操作mongodb的GridFS

golang使用mongo-driver操作mongodb的GridFS

背景

项目中有些文档的大小超过了16M,超出了mongodb一个文档的最大大小,于是就将文档对象转JSON字节数组后,将字节存成文件格式。

环境

go版本:go1.15.1
mongodb驱动包:  go\pkg\mod\go.mongodb.org\mongo-driver@v1.4.1

文件的存储

其实就是两个普通的集合Collection.默认分别为fs.files和fs.chunks
fs也能替换成自定义命名的
如下图
在这里插入图片描述

在这里插入图片描述

代码

package dao

import (
	"bytes"

	"local.com/util/logger"

	"go.mongodb.org/mongo-driver/mongo/gridfs"
	"go.mongodb.org/mongo-driver/mongo/options"
)

func getGridfsBucket(collName string) *gridfs.Bucket {
	var bucket *gridfs.Bucket
	// 使用默认文件集合名称
	if collName == "" || collName == options.DefaultName {
		bucket, _ = gridfs.NewBucket(MongoDatabase)
	} else {
		// 使用传入的文件集合名称
		bucketOptions := options.GridFSBucket().SetName(collName)
		bucket, _ = gridfs.NewBucket(MongoDatabase, bucketOptions)
	}
	return bucket
}

// 上传文件
// collName:文件集合名称 fileID:文件ID,必须唯一,否则会覆盖
// fileName:文件名称 fileContent:文件内容
func GridfsUploadWithID(collName, fileID, fileName string, fileContent []byte) error {
	bucket := getGridfsBucket(collName)
	err := bucket.UploadFromStreamWithID(fileID, fileName, bytes.NewBuffer(fileContent))
	if err != nil {
		logger.Error(err)
		return err
	}
	return nil
}

// 下载文件
// 返回文件内容
func GridfsDownload(collName, fileID string) (fileContent []byte, err error) {
	bucket := getGridfsBucket(collName)
	fileBuffer := bytes.NewBuffer(nil)
	if _, err = bucket.DownloadToStream(fileID, fileBuffer); err != nil {
		logger.Error(err)
		return nil, err
	}
	return fileBuffer.Bytes(), nil
}

// 删除文件
func GridfsDelete(collName, fileID string) error {
	bucket := getGridfsBucket(collName)
	if err := bucket.Delete(fileID); err != nil && err != gridfs.ErrFileNotFound {
		logger.Error(err)
		return err
	}
	return nil
}

调用代码

// 因某些文档数据长度大于16M,所以存到文件中
// 先删除文件
fileID="xxx"
_ = dao.GridfsDelete(fbSeasonStatsDetailAPI, fileID)
jsonBytes, _ := json.Marshal(list.Results)
_ = dao.GridfsUploadWithID(fbSeasonStatsDetailAPI, fileID, fileID+".json", jsonBytes) 

驱动包中提供的DEMO

可以查看驱动包下的示例文件来实现其他文件操作相关的方法
示例文件路径如下

go\pkg\mod\go.mongodb.org\mongo-driver@v1.4.1\mongo\gridfs\gridfs_examples_test.go
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值