MongoDB:使用子对象数组填充父对象,而不是按父对象ID搜索子对象

MongoDB:使用子对象数组填充父对象,而不是按父对象ID搜索子对象,mongodb,performance,indexing,mongoose-populate,Mongodb,Performance,Indexing,Mongoose Populate,我正在和我的经理就数据库结构进行争论 我们需要创建一个具有多个子对象的父类型对象,并查询属于该父对象的所有子对象的列表 我想在父对象中使用子对象数组,这些子对象是在创建子对象时添加的。可以使用FindById找到父列表,然后使用populate()填充子列表 我的经理坚持不在父对象中存储子对象数组,而只将父对象的id存储为每个子对象中的一个字段,然后通过搜索具有父对象id的所有子对象来获取列表。他声称这将同样快,因为“不管怎样,填充只是按id搜索对象” 然而,我似乎无法想象它会如此之快。一个_i

我正在和我的经理就数据库结构进行争论

我们需要创建一个具有多个子对象的父类型对象,并查询属于该父对象的所有子对象的列表

我想在父对象中使用子对象数组,这些子对象是在创建子对象时添加的。可以使用FindById找到父列表,然后使用populate()填充子列表

我的经理坚持不在父对象中存储子对象数组,而只将父对象的id存储为每个子对象中的一个字段,然后通过搜索具有父对象id的所有子对象来获取列表。他声称这将同样快,因为“不管怎样,填充只是按id搜索对象”

然而,我似乎无法想象它会如此之快。一个_id字段的全部作用不就是索引文件的位置以便快速检索吗?查找具有_id的对象列表不应该总是比在整个数据库中搜索给定字段与给定值匹配的对象更快、更具可伸缩性吗


在这种情况下不使用populate有什么理由吗?(当然,在子对象中存储对父对象的引用也是一种选择,但他坚持不在父对象中存储子对象数组。)

最好的方法不是简单的选择,它取决于数据的性质、您对未来数据集的期望以及您将如何查询数据,无论是现在还是将来

将每个子ID存储在父节点上的数组中肯定是一个可行的选择。这使得检索诸如“此父项有多少子项?”或“此父项是否包含这两个子项?”之类的信息变得很容易。它还简化了对子项的分页,因为客户端在检索父项时将接收所有子ID值,并且可以检索显示所需的任意多个子记录。在父级上的数组中存储附加数据,例如子级名称和添加的日期,这意味着客户端可以有足够的信息来显示指向每个子级的链接,而无需首先检索所有子级

这种方法也有一些缺点。如果一个父级的子级数量超过几百个,或者根本不受限制,那么当阵列变大时,将对性能产生严重影响。MongoDB特别建议

将父ID存储在每个子项中可以维护链接,而不需要单个字段,该字段不需要是数组。这意味着获取给定父项的子项列表将需要单独的查询,或
$lookup
,但将简化首先查找子项,然后链接到父项的过程。

这种方法完全避免了大型阵列问题,即使数据集在未来呈指数级增长

如果父对象将具有有限的嵌入文档,则应将子对象直接存储在父对象中。如果没有,那么在孩子身上有父母的id是一个更好的方法。我们不希望每个父母有很多孩子,但可能有大量的父母和孩子,我们通常需要检索给定父母的所有孩子的列表。$lookup本身与按父ID查找和从存储的子ID列表填充相比如何?如果“填充”是指mongoose填充方法,该方法在客户端处理,并将在子集合中为每个子级使用单独的查找。使用
$lookup
可以在一次往返中获取文档,是否需要对子集合进行多个查询取决于管道的结构。如果将父ID存储在子文档中,则可以找到2个查找的所有数据-一个用于父项,一个用于子项。因此,按_ID搜索本质上没有什么比按任何其他字段搜索更快的了?