【问题标题】:Is mongodb sub documents equivalent to Firestore subcollections?mongodb 子文档是否等同于 Firestore 子集合?
【发布时间】:2021-07-29 20:18:54
【问题描述】:

对于那些使用 Firebase (Firestore) 的人,您可以拥有一个包含文档的集合,其中每个文档都有一个 id,然后一个集合可以包含一个子集合(相当于一个嵌入文档作为文档数组作为属性)。

然后,这个子集合可以容纳许多文档,每个文档都有一个 id。

在 Firestore 中,子集合是延迟加载的。

它将获取该集合上的文档,但如果有一个或多个子集合,除非专门转到该路由,否则它将不会检索它。例如:collection/document/subcollectionname/anotherdocument

所以 2 个问题:

  1. 嵌入式文档是否延迟加载?除非我明确访问它,否则我不想获取包含所有嵌入文档(可能有一百万个)的文档。
  2. 如何确保 MongoDB 中的每个嵌入文档都获得 ObjectID("blablabla") 形式的“_id”?

编辑: 我目前有一个 Firestore 实现,它背后有一个子集合实践。

示例:组织 => documentId => 项目 => projectId => 活动 => :activityType => activityId

  1. 组织 包含文档的集合(每个文档 = 组织)。
  2. 每个组织文档都包含一个架构(id、名称、语言等。)和一些子集合,其中一个是 projects 子集合
  3. projects 子集合包含 projects 的文档。
  4. 项目文档包含项目架构(id、名称、位置等)和一个名为activities的子集合。
  5. activities 子集合拥有自己的架构(id、type、category 等...)和另外 6 个子集合,每个子集合代表一个活动类型。
  6. 每个活动子集合都有自己的模式。没有更多的子集合。

现在,这样做的好处是,如果我选择获取所有组织,那么我将仅获取组织 collection文档,而不是嵌入的子集合(projectsetc..)在 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


【解决方案1】:

一个项目可以有多少活动?如果没有限制,那么您最好为活动创建一个根级别的集合。 在 MongoDB 中,最大 BSON 文档大小为 16 MB您可能无法将所有项目及其活动存储在单个文档(组织文档)中。

我将创建 3 个集合,即 - 组织、项目和活动。

  1. 每个组织都应在 organizations 集合中拥有一个与 Firestore 中类似的文档。
  2. 每个项目都应在 projects 集合中包含一个包含字段“organizationID”的文档,以便您可以使用其 ID 查询特定组织的项目。这相当于您的项目子集合中的文档。每个项目还必须有自己的唯一 ID。
  3. 每个活动都应在 activities 集合中包含一个包含字段“projectID”的文档,以便可以检索特定项目的活动。

我已经添加了这些额外的 organizationIDprojectID 字段,即使您有 _id 以防万一您希望在其中使用 Firestore 文档 ID 以便于并排查询。

通过这种方式,您不必担心 16 MB 文档大小限制,只要您有正确的 ID,查询项目和活动就会更容易。

查询某个项目的活动:

await db.collection("activities").find({projectID: "myProjectID"}).toArray()

此后,如何编写带有投影、聚合等的查询由您决定。

【讨论】:

  • @SunnyRahi 最好在另一个问题中提供有关您的用例的更多详细信息,就像这个问题的 OP 所做的那样。
  • 糟糕,我刚刚编辑了它?
  • 你好,哪个效率更高?就像我们可以将所有活动作为我的子集合假设 user.doc("userId").collection("activities")。 Get() 或 mongodb 查找查询 db.collection("activities").find({projectID}) 去每个与我的 userId 匹配的文档?它是否像火场一样高效?
猜你喜欢
  • 2021-07-04
  • 2013-07-12
  • 2022-10-19
  • 2020-08-25
  • 2019-01-08
  • 2018-10-21
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多