【问题标题】:MongoDB schema to store directories with JSON files用于存储带有 JSON 文件的目录的 MongoDB 模式
【发布时间】:2021-07-19 17:05:42
【问题描述】:

假设我有很多 JSON 文件存储在文件系统中,例如

├── a
│   ├── a-1.json
│   ├── a-2.json
│   ├── a1
│   │   └── a11
│   │       ├── a11-1.json
│   │       └── a11-2.json
│   └── a2
│       └── a2-1.json
├── b
│   └── b1
│       ├── b1-1.json
│       └── b1-2.json
└── c
    └── c-1.json

现在我需要将所有这些带有目录结构的 JSON 文件存储在 MongoDB 中。
所以我想创建两个集合:“文件”和“目录”。 “files”集合包含 JSON 文件。

 { "id" : 12345, "name" : "a-1", ... }
 { "id" : 67890, "name" : "a-2", ... }

“dirs”集合包含与目录对应的文档。例如:

{"a" : {files: [12345, 67890], "a1:" : {"a11": {files: [...]}}, "a2" : {...}}
{"b" : {"b1" : {files: [...]}}}
{"c" : {files: [...]}}

这个架构有意义吗?

【问题讨论】:

  • 也许{folder: "\a\a1\a11", files: [ "a11-1.json", "a11-2.json"] } 更通用
  • 感谢您的建议。为什么你用文件名而不是 id ?文件名不是唯一的。
  • 不明白你的意思。
  • 你是对的。我的评论不清楚。我想知道你为什么使用文件名数组files: ["a11-1.json", "a11-2.json"]而不是ids、e、g、files: [<id of a11-1.json>, <id of a11-2.json>]的数组
  • 由你决定,什么是“”?一个文件有一个文件名,还有什么? (除了一些文件系统内部的东西)。当然,定义 2 个集合不是一个聪明的主意。只用一个!像 MonogDB 这样的 NoSQL 数据库不是像 Oracle 或 MySQL 这样的关系数据库。应该避免查找,它们没有针对它进行优化,并且一些 NoSQL 系统根本不支持查找。

标签: mongodb database-schema


【解决方案1】:

两种策略

您可以为每个文件创建一条记录,其中包含完整路径。

{ "_id" : 1, "name" : "/a/a1/a11/a11-1.json" }
{ "_id" : 2, "name" : "/a/a1/a11/a11-2.json" }

易于添加/删除文件和搜索。这就是它在 S3 中的完成方式。

如果你真的不想要冗余数据,那么你需要创建节点/子模型。

对于 parent = parent _id 或 0 对于 root 对于类型 0 = 目录,1 = 文件。

{ "_id"  : 1, "parent" : 0, "type" : 0, "name" : "a" }
{ "_id"  : 2, "parent" : 1, "type" : 0, "name" : "a1" }
{ "_id"  : 3, "parent" : 2, "type" : 0, "name" : "a11" }
{ "_id"  : 4, "parent" : 3, "type" : 1, "name" : "a11-1.json" }
{ "_id"  : 5, "parent" : 3, "type" : 1, "name" : "a11-2.json" }

维护起来更复杂。

如果您不知道一个目录中可以有多少个文件,请避免使用数组,因为文档大小限制为 16 MB。加载 16 MB 的文档不是很理想。

https://docs.mongodb.com/manual/reference/limits/

【讨论】:

  • 非常感谢。我喜欢解决方案#1。现在我只是想知道如何搜索给定文件夹中的所有文件。搜索路径为“/a/a1”的所有文件是否有效?
  • 使用正则表达式。例如 Find({ "name": /^\/a\/a1\/a11\/.*/i }) 将给出目录 a11 中的所有文件。在名称上添加索引以提高效率。
  • 看起来不错。谢谢!
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2012-07-04
  • 2014-04-08
  • 2012-01-09
  • 1970-01-01
  • 2016-03-17
相关资源
最近更新 更多