一架梯子,一头程序猿,仰望星空!
MongoDB面试题 > 内容正文

简要介绍 MongoDB 的 GridFS,以及它的应用场景。


问题简答

MongoDB 的 GridFS 是一种文件存储方式,可以用于存储超过 16MB 的大文件,以及需要支持随机访问的文件。GridFS 将大文件分割成多个块进行存储,每个块默认大小为 255KB,同时为每个块建立索引,以便于随机访问文件的任意部分。

问题详解:

GridFS应用场景&优势

GridFS 适用于需要存储大量二进制数据的场景,例如音视频文件、图片文件、大型文档等。

与传统的文件系统相比,GridFS 具有以下优势:

  1. 分布式存储:GridFS 可以将大文件分割成多个块进行存储,这些块可以分布在多个服务器上,从而实现分布式存储。
  2. 可扩展性:由于 GridFS 支持分布式存储,因此可以随着数据量的增加而水平扩展存储容量。
  3. 适应多种应用场景:GridFS 支持随机访问文件的任意部分,适用于需要随机访问文件的应用场景。
  4. 与 MongoDB 集成:GridFS 与 MongoDB 集成紧密,可以直接使用 MongoDB 的查询和索引功能,提高数据访问效率。

Golang GridFS例子

使用 GridFS 将大文件存储到 MongoDB 中:

package main

import (
    "context"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/gridfs"
    "go.mongodb.org/mongo-driver/mongo/options"
    "os"
)

func main() {
    // 连接mongodb
    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
    client, err := mongo.Connect(context.Background(), clientOptions)

    if err != nil {
        // handle error
    }

    // 切换数据库
    db := client.Database("mydatabase")

    // 创建GridFS bucket,就是文件存储在那个地方
    fs, err := gridfs.NewBucket(
        db,
        options.GridFSBucket().SetName("mybucket"),
    )

    if err != nil {
        // handle error
    }

    // 打开一个视频文件
    file, err := os.Open("video.mp4")
    if err != nil {
        // handle error
    }

    defer file.Close()

    // 打开一个GridFS的文件流,用于上传文件
    uploadStream, err := fs.OpenUploadStream("video.mp4")
    if err != nil {
        // handle error
    }

    defer uploadStream.Close()

    // 通过字节拷贝,将本地文件上传到grid fs
    _, err = io.Copy(uploadStream, file)
    if err != nil {
        // handle error
    }

    // 获取刚上传的视频文件id
    id := uploadStream.FileID
}