Mongodb Mongo go驱动程序GridFS元数据
我为我工作的公司写了一个聊天应用程序,我和mgo司机一起工作了一段时间。 现在我们将mgo重构为官方的mongo驱动程序。 我已经实现了GridFS来处理聊天文件,因为它们不大,而且简化了工作。 以前的mgo驱动程序在保存文件时有一个数据列表,其中一个字段是contentType(对吗?) 所以在重构了这个任务中包含的大部分服务之后,我注意到新的官方mongo驱动程序并没有做到这一点 所以我决定尝试手动添加此字段,但后来我不明白如何才能添加 尝试了Mongodb Mongo go驱动程序GridFS元数据,mongodb,go,gridfs,Mongodb,Go,Gridfs,我为我工作的公司写了一个聊天应用程序,我和mgo司机一起工作了一段时间。 现在我们将mgo重构为官方的mongo驱动程序。 我已经实现了GridFS来处理聊天文件,因为它们不大,而且简化了工作。 以前的mgo驱动程序在保存文件时有一个数据列表,其中一个字段是contentType(对吗?) 所以在重构了这个任务中包含的大部分服务之后,我注意到新的官方mongo驱动程序并没有做到这一点 所以我决定尝试手动添加此字段,但后来我不明白如何才能添加 尝试了options.GridFSUpload().S
options.GridFSUpload().SetMetadata(metadata)
,但我不理解它的逻辑,而且新的mongo驱动程序在GO中运行的结果实际上是互联网最小的
任何人都可以告诉我如何将自定义字段添加到文件文档中?
喜欢contentType
非常感谢
这是我试图做的一个例子
// 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
}
抱歉,如果我错过了一些东西,因为我对围棋没有那么多经验
感谢您的帮助以下是
SetMetadata()
的一个示例
这里是这里是
SetMetadata()的一个示例
这是你想要理解的逻辑。在新的官方mongo驱动程序中找不到很多关于contentType的内容,是因为在编写驱动程序之前很久
我必须承认,警察没有提到这件事。事实上,官方mongofiles cli仍然使用传统格式
规范直截了当地说:
注意:一些旧版本的GridFS实现允许应用程序在根级别向文件集合文档添加任意字段。GridFS的新实现将不允许这样做,但必须准备好处理可能具有附加字段的现有文件集合文档
如果您喜欢更详细的信息:
为什么不推荐使用contentType
驱动程序直接使用文件集合文档中的大多数字段,但元数据、contentType和别名除外。所有纯粹用于应用程序的信息都应嵌入“元数据”文档中。建议希望存储contentType以便在其应用程序中使用的GridFS用户在“元数据”文档中添加“contentType”字段,而不是使用不推荐使用的顶级“contentType”字段
这有点道理。驱动程序严格遵循规范的措辞-除了在元数据中,无法在任何地方创建contentType
属性,但是Bucket.Find仍将返回由“旧版本”创建的文件的contentType
从传统gridfs到新格式的一次性转换可以简单到:
db.getCollection("fs.files").aggregate([
{$addFields: {
"length" : {$toLong: "$length"},
"metadata.contentType": { $ifNull: [ "$contentType", "$metadata.contentType" ] }
}},
{ $out : "fs.files" }
])
假设您的bucket是默认的“fs”,并且您不打算以传统格式上载文件。
如果您有大量的空闲空间,那么将输出到新的临时集合,验证它,然后重命名,这并不是一个糟糕的主意
如果出于任何原因必须支持旧格式,您仍然可以直接访问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”是您的bucket名称,contentType
是要设置为contentType的字符串值
请记住,“一些旧版本”使用int32表示文件长度tho。新驱动程序希望它是int64。
单独使用*.fiiles集合的类似查找的操作应该没有问题,但可能会导致使用新的官方驱动程序下载此类文件时出现问题。您没有试图理解的逻辑。在新的官方mongo驱动程序中找不到很多关于contentType的内容,是因为在编写驱动程序之前很久
我必须承认,警察没有提到这件事。事实上,官方mongofiles cli仍然使用传统格式
规范直截了当地说:
注意:一些旧版本的GridFS实现允许应用程序在根级别向文件集合文档添加任意字段。GridFS的新实现将不允许这样做,但必须准备好处理可能具有附加字段的现有文件集合文档
如果您喜欢更详细的信息:
为什么不推荐使用contentType
驱动程序直接使用文件集合文档中的大多数字段,但元数据、contentType和别名除外。所有纯粹用于应用程序的信息都应嵌入“元数据”文档中。建议希望存储contentType以便在其应用程序中使用的GridFS用户在“元数据”文档中添加“contentType”字段,而不是使用不推荐使用的顶级“contentType”字段
这有点道理。驱动程序严格遵循规范的措辞-除了在元数据中,无法在任何地方创建contentType
属性,但是Bucket.Find仍将返回由“旧版本”创建的文件的contentType
从传统gridfs到新格式的一次性转换可以简单到:
db.getCollection("fs.files").aggregate([
{$addFields: {
"length" : {$toLong: "$length"},
"metadata.contentType": { $ifNull: [ "$contentType", "$metadata.contentType" ] }
}},
{ $out : "fs.files" }
])
假设您的bucket是默认的“fs”,并且您不打算以传统格式上载文件。
如果您有大量的空闲空间,那么将输出到新的临时集合,验证它,然后重命名,这并不是一个糟糕的主意
如果出于任何原因必须支持旧格式,您仍然可以直接访问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”是您的bucket名称,contentType
是要设置为contentType的字符串值
请记住,“一些旧版本”使用int32表示文件长度tho。新驱动程序希望它是int64。
单独使用*.fiiles集合的类似查找的操作应该可以,但使用新的官方驱动程序下载此类文件时可能会出现问题。谢谢您的示例,ca