【发布时间】:2021-07-29 20:18:54
【问题描述】:
对于那些使用 Firebase (Firestore) 的人,您可以拥有一个包含文档的集合,其中每个文档都有一个 id,然后一个集合可以包含一个子集合(相当于一个嵌入文档作为文档数组作为属性)。
然后,这个子集合可以容纳许多文档,每个文档都有一个 id。
在 Firestore 中,子集合是延迟加载的。
它将获取该集合上的文档,但如果有一个或多个子集合,除非专门转到该路由,否则它将不会检索它。例如:collection/document/subcollectionname/anotherdocument
所以 2 个问题:
- 嵌入式文档是否延迟加载?除非我明确访问它,否则我不想获取包含所有嵌入文档(可能有一百万个)的文档。
- 如何确保 MongoDB 中的每个嵌入文档都获得 ObjectID("blablabla") 形式的“_id”?
编辑: 我目前有一个 Firestore 实现,它背后有一个子集合实践。
示例:组织 => documentId => 项目 => projectId => 活动 => :activityType => activityId
- 组织 包含文档的集合(每个文档 = 组织)。
- 每个组织文档都包含一个架构(id、名称、语言等。)和一些子集合,其中一个是 projects 子集合
- projects 子集合包含 projects 的文档。
- 项目文档包含项目架构(id、名称、位置等)和一个名为activities的子集合。
- activities 子集合拥有自己的架构(id、type、category 等...)和另外 6 个子集合,每个子集合代表一个活动类型。
- 每个活动子集合都有自己的模式。没有更多的子集合。
现在,这样做的好处是,如果我选择获取所有组织,那么我将仅获取组织 collection 的 文档,而不是嵌入的子集合(projects、etc..)在 MongoDB 中,我会得到每个文档的 EVERYTHING。
如何在MongoDB中实现具有自己的嵌套文档结构和延迟加载效果的相同嵌套文档?
【问题讨论】:
-
我在 MongoDB 中没有使用太多嵌套文档,而是将子集合转换为集合。假设在 Firestore 中您有
posts -> {postID} -> comments -> {commentID}然后在 Mongo 中 cmets 是它自己的集合,并且其中的每个文档都包含项目 ID。这也将防止您达到每个文档 16 MB 的限制。你的用例是什么? -
我将很快编辑我的用例。根据您的方法,我将始终拥有根集合?如果我已经在 firestore 中有 60 个现有集合,其中一些是双重嵌套的怎么办?我应该如何处理?
-
如果您可以分享您目前在 Firestore 中拥有的内容,那么对此发表评论会更容易。
-
@Dharmaraj 这个解释是否足以描述我的问题?我确实明白我可以对事物进行不同的建模。但是,我真的很想知道 Mongo 中子集合的做法
标签: node.js mongodb firebase google-cloud-firestore nosql