3

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

{USS_NewYork:{type:"BattleShip"}}
{USS_Enterprise:{type:"Carrier"}}
{dog:{type:"Mammal"}}

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

4

1 回答 1

4

因为 MongoDB 集合是异构的,所以在技术上可以将文档存储在一个集合中,而这些文档彼此无关。但是为不同的文档类设置不同的集合的好处是,您可以轻松地将这些文档彼此隔离开来。

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

想象在您的示例中,您希望列出所有不同类型的鲨鱼的动物列表。所以你做db.collection.find({type:"Shark"}。但不幸的是,您不知道还有一种名为“鲨鱼”的帆船。因此,虽然您预计会得到一些肉食性鱼类,但中间有几艘帆船。Ships 在返回的文档中缺少您期望的一些字段,例如habitatand preferred_food,因此这可能会导致您的应用程序崩溃。

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

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

于 2013-07-28T18:37:30.643 回答