Mongodb模式/模型中文件的字段类型是什么?

时间:2019-01-11 17:32:09

标签: node.js mongodb

我正在使用Mongo模式发布表单。适用于所有字符串,但现在我正尝试上传文件。我应指定文件在架构中属于哪种类型的字段?

@RestController
public class TestController {
  @GetMapping("/test")
  public Resource<User> getTest() {
    Resource<User> resource = new Resource<>();
    resource.setData(new User("test user"));
    return resource;
  }


  @Builder
  @Getter
  @Setter
  @AllArgsConstructor
  static class User {
    private String username;
  }

  @Getter
  @Setter
  @AllArgsConstructor
  @NoArgsConstructor
  static class Resource<T> {
    private T data;
    private Set<String> errors;
  }
}

我应该使用哪种类型的“源”字段,该字段将是来自表单的文件

2 个答案:

答案 0 :(得分:1)

通常,您将文件数据存储到数据库中(如果要存储文件的话)。

有几种存储文件数据的方法。

  1. 您的文件大小小于16 MB。您可以将数据直接存储到集合中的缓冲区(二进制数据)中。

    source : { data: Buffer, contentType: String }
    
  2. 如果文件大小超过16MB,则可以使用GridFS

  3. 您将文件存储在磁盘上,仅存储mongodb集合的路径。在这种情况下,类型将只是字符串。

答案 1 :(得分:0)

这实际上取决于您的用例-特别是您要处理的约束。

我可以想到两种方法:

  1. 将其存储为type: Buffer
  2. 将其存储为type: String中的base64

将其存储为Buffer可能是存储空间/速度方面最有效的方法。它还使您可以灵活地将其转换为用例所需的任何类型。

将其存储为String将使您在需要访问文件进行下载时可以更轻松地控制文件内容,因为您无需从Buffer转换为base64

我个人比较喜欢将文件存储为Buffer,并附加到其他必填字段上,例如filenamemimetype,它们会产生类似以下内容:

source: {
        file: { type: Buffer, required: true },
        filename: { type: String, required: true },
        mimetype: { type: String, required: true }
      }

...但是这也特定于我的用例。

还有第三种选择,即在文件中使用GridFS将其存储在mongo中,以防文件大小超过16MB。您可以在其官方文档页面中了解更多相关信息:https://docs.mongodb.com/manual/core/gridfs/