我可以将所有对象保存在 mongodb 的一个集合中吗?

Arc*_*ang 3 collections mongodb

使用集合的最佳实践是什么?既然集合不是强制执行方案的,为什么不将每个对象保存在一个集合中呢?可以通过像这样的物体

{USS_NewYork:{type:"BattleShip"}}
{USS_Enterprise:{type:"Carrier"}}
{dog:{type:"Mammal"}}
Run Code Online (Sandbox Code Playgroud)

我可以将船和狗保存在一个集合中并轻松找到正确的对象,那么为什么我必须将这些对象划分到不同的集合中呢?但是如果我总是将对象保存在一个集合中,为什么 mongodb 隐含了该集合?

Phi*_*ipp 5

由于 MongoDB 集合是异构的,因此在技术上可以将彼此无关的文档存储在一个集合中。但是,为不同类别的文档提供单独的集合的优点是您可以轻松地将这些文档彼此隔离。

在您的示例中,如果您有动物和船只,则您不太可能有应该返回动物和船只的搜索查询。大多数查询可能会返回来自一组动物或一组船只的一个或多个文档。

想象一下,在您的示例中,您希望有一个包含不同类型Sharks的所有动物的列表。所以你也是db.collection.find({type:"Shark"}。但不幸的是你不知道还有一种帆船叫做“鲨鱼”。因此,虽然您希望捕获大量肉食性鱼类,但中间却有几艘帆船。Ships 缺少您期望在返回的文档中出现的一些字段,例如habitatpreferred_food,因此这可能会导致您的应用程序崩溃。

当然,可以通过向每个文档添加另一个强制字段class:"animal"class:"ship" 确保每个查找查询指定类来缓解这种情况,但这本质上是重新发明集合。

通过集合隔离文档的另一个原因是它可以更轻松地应用良好的索引。您的应用程序可能经常按类型搜索船舶,但仅按名称搜索动物。因此,对于 class=animal 的所有对象有一个名称索引,对于 class=ship 的所有对象有一个类型索引是有意义的。但是,除非您将这些文档放在不同的集合中,否则您将无法做到这一点,因此每个文档将至少有一个不必要的索引,需要在每次写入操作时保持最新。当你的数据库中有数百万只动物但只有十几艘船时,这变得非常荒谬。当所有动物都携带一个仅适用于船舶的索引时,这将是相当浪费的。