返回顶部
首页 > 资讯 > 后端开发 > GO >Mongo-go-driver GridFS 元数据
  • 164
分享到

Mongo-go-driver GridFS 元数据

2024-04-05 00:04:40 164人浏览 独家记忆
摘要

大家好,我们又见面了啊~本文《MonGo-go-driver GridFS 元数据》的内容中将会涉及到等等。如果你正在学习golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,

大家好,我们又见面了啊~本文《MonGo-go-driver GridFS 元数据》的内容中将会涉及到等等。如果你正在学习golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我为我工作的公司编写了一个聊天应用程序,并且我与 mgo 驱动程序一起工作了一段时间。 现在我们将 mgo 重构为官方 mongo 驱动程序。 我已经实现了 gridfs 来处理聊天文件,因为它们并不大,而且它简化了工作。 以前的 mgo 驱动程序在保存文件时有一个数据列表,其中一个字段是 contenttype(很好,对吧?)

因此,在重构此任务中包含的大部分服务后,我注意到新的官方 mongo 驱动程序不会执行此操作?

所以我决定尝试手动添加此字段,但后来我发现我不明白该怎么做?

尝试过 options.gridfsupload().setmetadata(metadata) 但我不明白它的逻辑,而且互联网对于在 go 中工作的新 mongo 驱动程序的结果来说确实很小。

任何人都可以给我提示如何将自定义字段添加到文件文档吗? 喜欢内容类型!!

非常感谢。

这是我尝试做的一个例子

// GridFSInsert -
func GridFSInsert(fileName string, data []byte, metadata ...bsonx.Elem) (primitive.ObjectID, error) {
    checkMongoConnection(false)
    var fileID primitive.ObjectID
    bucket, bucketErr := gridFs.NewBucket(
        Mongo.Client.Database(Mongo.DBName),
        options.GridFSBucket().SetName(gridFSColName),
    )
    if bucketErr != nil {
        return fileID, bucketErr
    }
    uploadStream, uploadStreamErr := bucket.OpenUploadStream(
        fileName,
        options.GridFSUpload().SetMetadata(metadata),
    )
    if uploadStreamErr != nil {
        return fileID, uploadStreamErr
    }
    defer uploadStream.Close()

    fileSize, writeErr := uploadStream.Write(data)
    if writeErr != nil {
        return fileID, writeErr
    }
    fileID = uploadStream.FileID
    log.Printf("Write file to DB was succesful, File size: %d", fileSize)

    return fileID, nil
}

很抱歉,如果我错过了一些东西,因为我对 go 的经验并不如我所愿。

感谢您的帮助


解决方案


没有您想要理解的逻辑。之所以在新的官方mongo驱动中找不到太多关于contenttype的信息,是因为contentType has been deprecated in gridfs spec早在驱动编写之前就已经存在了。

我必须承认gridfs documentation没有提到它。事实上官方 mongofiles cli 仍然使用旧格式。

规范说得很清楚:

注意:某些旧版本的 gridfs 实现允许应用程序向根级别的文件集合文档添加任意字段。 gridfs 的新实现不允许这样做,但必须准备好处理可能具有其他字段的现有文件集合文档。

如果您喜欢更详细的信息official reasoning:

为什么 contenttype 被弃用?

文件集合文档中的大多数字段都由驱动程序直接使用,但元数据、contenttype 和别名除外。所有纯粹用于应用程序的信息都应嵌入“元数据”文档中。我们鼓励想要存储 contenttype 以在其应用程序中使用的 gridfs 用户将“contenttype”字段添加到“元数据”文档,而不是使用已弃用的顶级“contenttype”字段。

这有点道理。驱动程序从字面上遵循规范的措辞 - 除了 metadata 之外,无法在任何地方创建 contenttype 属性,但 bucket.find 仍将返回由“旧版本”创建的文件的 contenttype

从旧版 gridfs 到新格式的一次性转换可以非常简单:

db.getcollection("fs.files").aggregate([
    {$addfields: { 
        "length" : {$tolong: "$length"},
        "metadata.contenttype": { $ifnull: [ "$contenttype", "$metadata.contenttype" ] } 
    }},
    { $out : "fs.files" }
])

假设您的存储桶是默认的“fs”,并且您不打算上传旧格式的文件。 如果您有足够的可用空间,那么 out 到新的临时集合,验证它,然后重命名并不是一个糟糕的主意。

如果您出于任何原因必须支持旧格式,您仍然可以直接访问 gridfs 集合:

// in your code snippet after
fileid = uploadstream.fileid

// update the document that represent uploaded file
files := db.collection("fs.files")
updateresult, err := files.updateone(
    context.background(),
    bson.d{{"_id", fileid}},
    bson.d{{"$set", bson.d{{"contenttype", contenttype}}}},
)

其中“fs”是您的存储桶名称,contenttype 是您要设置为 contenttype 的字符串值。

请记住,“某些旧版本”使用 int32 作为文件长度。新驱动程序期望它是 int64。 对于单独使用 *.fiiles 集合的类似 find 的操作应该没问题,但可能会导致使用新的官方驱动程序下载此类文件时出现问题。

这里是 setmetadata() 的示例。

opts := options.GridFSUpload()
opts.SetMetadata(bsonx.Doc{{Key: "content-type", Value: bsonx.String("application/JSON")}})
if ustream, err = bucket.OpenUploadStream("test.txt", opts); err != nil {
    t.Fatal(err)
}

这是 full example

今天关于《Mongo-go-driver GridFS 元数据》的内容介绍就到此结束,如果有什么疑问或者建议,可以在编程网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

您可能感兴趣的文档:

--结束END--

本文标题: Mongo-go-driver GridFS 元数据

本文链接: https://www.lsjlt.com/news/596706.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何正确处理使用 Mux 的 Go 的可选查询参数?
    本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《如何正确处理使用 Mux 的 Go 的可选查询参数?》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~问题...
    99+
    2026-06-09
  • 如何在golang中格式化txt?
    知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《如何在golang中格式化txt?》,在实现功能的过程中也带大家重新温习相关知识点,温故而知...
    99+
    2026-06-09
  • 使用 golang 在 google admin sdk api 上获取 400 invalid_grant。有什么建议么?
    一分耕耘,一分收获!既然都打开这篇《使用 golang 在 google admin sdk api 上获取 400 invalid_grant。有什么建议么?》,就坚持看下去,学下去吧!本文主要会...
    99+
    2026-06-09
  • 我可以在应用程序引擎上部署 Golang 应用程序并在不修改代码的情况下读取/写入文件吗?
    在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天编程网就整理分享《我可以在应用程序引擎上部署 Golang ...
    99+
    2026-06-09
  • Sqlx 连接具有相同字段的表
    对于一个Golang开发者来说,牢固扎实的基础是十分重要的,编程网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《Sqlx 连接具有相同字段的表》,主要介绍了,希望对大家的知识积累有所帮助...
    99+
    2026-06-09
  • 如何从 go 中的另一个包访问结构变量?
    各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《如何从 go 中的另一个包访问结构变量?》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很...
    99+
    2026-06-09
  • 使用 kafka-go 在 Kafka 中计划创建消费者
    编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天编程网就整理分享《使用 kafka-go 在 Ka...
    99+
    2026-06-09
  • 无法从 Golang 中的 Google userinfo API 响应访问电话号码(使用 golang.org/x/oauth2 和 Google People API)
    有志者,事竟成!如果你在学习Golang,那么本文《无法从 Golang 中的 Google userinfo API 响应访问电话号码(使用 golang.org/x/oauth2 和 Googl...
    99+
    2026-06-09
  • 如何使用 Gin-Gonic 在 Go 中读取蛇形 JSON 请求正文
    各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《如何使用 Gin-Gonic 在 Go 中读取蛇形 JSON 请求正文》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉...
    99+
    2026-06-09
  • 将带有指针值的interface{}类型传递给interface{}参数
    小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《将带有指针值的interface{}类型传递给interface{}参数》,就很适合你,本篇文章讲解的知识点主要包括。在...
    99+
    2026-06-09
  • 协会不处理测试条目
    今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《协会不处理测试条目》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起...
    99+
    2026-06-09
  • 如何UT上传文件
    珍惜时间,勤奋学习!今天给大家带来《如何UT上传文件》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学...
    99+
    2026-06-09
  • 为什么 go 程序将输出打印到终端屏幕而不是 /dev/stderr?
    各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《为什么 go 程序将输出打印到终端屏幕而不是 /dev/stderr?》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉...
    99+
    2026-06-09
  • 如何在 GO 中将“_Ctype_int”更改为“int”?
    小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《如何在 GO 中将“_Ctype_int”更改为“int”?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中...
    99+
    2026-06-09
  • 为什么我的自定义错误类型会导致特定模式的错误?
    有志者,事竟成!如果你在学习Golang,那么本文《为什么我的自定义错误类型会导致特定模式的错误?》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续...
    99+
    2026-06-09
  • 如何从空的 interface{} 类型访问 JSON 数据中的字段?
    大家好,我们又见面了啊~本文《如何从空的 interface{} 类型访问 JSON 数据中的字段?》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Go...
    99+
    2026-06-09
  • 如何在Golang中为Azure SDK指定x509证书
    你在学习Golang相关的知识吗?本文《如何在Golang中为Azure SDK指定x509证书》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实...
    99+
    2026-06-09
  • etcd 事务中的原子计数器增量
    知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《etcd 事务中的原子计数器增量》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新...
    99+
    2026-06-09
  • 将字段添加到 MongoDB 内部对象
    知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《将字段添加到 MongoDB 内部对象》,在实现功能的过程中也带大家重新温习相关知识点,温故...
    99+
    2026-06-09
  • 为什么 rows.Next() 取决于数据库响应率?
    亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《为什么 rows.Next() 取决于数据库响应率?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质...
    99+
    2026-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作