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

时间:2013-07-28 15:40:38

标签: mongodb collections

使用收藏的最佳做法是什么? 由于集合不是方案强制执行,为什么不将每个对象保存在一个集合中? 有像

这样的对象
{USS_NewYork:{type:"BattleShip"}}
{USS_Enterprise:{type:"Carrier"}}
{dog:{type:"Mammal"}}

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

1 个答案:

答案 0 :(得分:2)

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

在你的例子中,你有动物和船只,你不太可能有搜索查询本应返回动物和船只。大多数查询可能会从一组动物或一组船上返回一个或多个文件。

想象一下,在您的示例中,您希望列出所有不同类型Sharks的动物。所以你做db.collection.find({type:"Shark"}。但不幸的是你没有意识到there is also a type of sailboat named "Shark"。因此,虽然你期望得到一些食肉鱼,但你们之间有几艘帆船。在您返回的文档中,船只缺少您期望的某些字段,例如habitatpreferred_food,因此这可能会导致您的应用程序崩溃。

当然可以通过向每个文档class:"animal"class:"ship"添加另一个必填字段来减轻这种情况,并确保每个查找查询都指定了类,但这基本上是重新发明集合。

按集合隔离文档的另一个原因是它可以更容易地应用好的索引。您的应用程序可能经常按类型搜索船只,但仅按名称搜索动物。因此,对于class = animal的所有对象的名称都有一个索引,而对于class = ship的所有对象,在类型上有另一个索引是有意义的。但除非您将这些文档放在不同的集合中,否则您将无法执行此操作,因此每个文档至少会有一个不必要的索引,需要与每个写入操作保持同步。当您的数据库中有数百万只动物但只有十几只船只时,这就变得非常荒谬了。如果所有动物都携带一个仅适用于船只的指数,那将是非常浪费的。