【问题标题】:can I save every objects in one collection in mongodb?我可以将每个对象保存在 mongodb 的一个集合中吗?
【发布时间】:2013-07-28 09:50:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: mongodb collections


    【解决方案1】:

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

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

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

    这当然可以通过在每个文档 class:"animal"class:"ship" 中添加另一个必填字段来缓解,并确保每个查找查询都指定类,但这实际上是在重新发明集合。

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

    【讨论】:

    • 通过您的回答,我觉得将所有内容都放在一个集合中并没有真正的问题。我可以通过查找结果的模糊性来说明一些场景,例如当我需要知道我的收藏中每个有四条腿的生物时。索引可能是一个真正的问题,但当没有那么多数据时,它不是必需的。
    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多