Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongo go驱动程序GridFS元数据_Mongodb_Go_Gridfs - Fatal编程技术网

Mongodb Mongo go驱动程序GridFS元数据

Mongodb Mongo go驱动程序GridFS元数据,mongodb,go,gridfs,Mongodb,Go,Gridfs,我为我工作的公司写了一个聊天应用程序,我和mgo司机一起工作了一段时间。 现在我们将mgo重构为官方的mongo驱动程序。 我已经实现了GridFS来处理聊天文件,因为它们不大,而且简化了工作。 以前的mgo驱动程序在保存文件时有一个数据列表,其中一个字段是contentType(对吗?) 所以在重构了这个任务中包含的大部分服务之后,我注意到新的官方mongo驱动程序并没有做到这一点 所以我决定尝试手动添加此字段,但后来我不明白如何才能添加 尝试了options.GridFSUpload().S

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

所以在重构了这个任务中包含的大部分服务之后,我注意到新的官方mongo驱动程序并没有做到这一点

所以我决定尝试手动添加此字段,但后来我不明白如何才能添加

尝试了
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