mongodb 子文档等同于 Firestore 子集合吗?

Jos*_*h D 7 mongodb nosql node.js firebase google-cloud-firestore

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

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

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

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

所以有2个问题:

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

编辑:我目前有一个 firestore 实现,其背后有一个子集合/s 实践。

示例:组织=>文档 ID =>项目= >项目ID => 活动=> :activityType =>活动 ID

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

现在,它的好处是,如果我选择获取所有组织,那么我将仅获取组织集合的文档,而不是嵌入的子集合(项目 ,而在MongoDB中,我将获取每个文档的所有内容。

如何在 MongoDB 中实现具有自己的嵌套文档结构和延迟加载效果的相同嵌套文档?

Dha*_*raj 5

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

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

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

在此输入图像描述

我添加了这些额外的organizationID,projectID字段,即使您_id希望在其中包含 Firestore 文档 ID 以便更轻松地进行并排查询。

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

查询某个项目的活动:

await db.collection("activities").find({projectID: "myProjectID"}).toArray()
Run Code Online (Sandbox Code Playgroud)

此后,您可以决定如何使用投影、聚合等编写查询。