是否可以将多种类型的对象存储到1个mongodb集合中?

时间:2014-03-05 15:45:33

标签: mongodb morphia document-oriented-db

使用文档oriënted数据库mongodb和对象文档映射器(ODM)morphia

假设我们有3个不同的班级; ObjectCategoryAction 这些对象都存储在集合中;对象,类别和动作。

CategoryActionObject

的引用
@Entity("objects")
public class Object {

    @Id
    @Property("id")
    private ObjectId id;

    @Reference
    private Category category;
    private Action action;
    ...
}

@Entity("categories")
public class Category {

    @Id
    public String categoryTLA;
    public String categoryName;
    ...
}

@Entity("actions")
public class Action implements BaseEntity {

    @Id
    public String action;
    public int accesLevel;
    ...
}

具有当前实现的文档存储如下:

  • Mongo (服务器/位置)
    • 存储 (数据库)
      • 对象 (收藏)
        • 对象 (文档)
        • 物体
        • 物体
      • 类别
        • categorie
        • categorie
        • categorie
      • 动作
        • 动作
        • 动作
        • 动作

是否可以在一个集合中存储2个不同的对象,在本例中为CategoryAction,如下一个示例所示?两者都有自己的身份!

  • 蒙哥
      • 对象
        • 物体
        • 物体
        • 物体
      • 设置
        • categorie
        • categorie
        • categorie
        • 动作
        • 动作
        • 动作

2 个答案:

答案 0 :(得分:9)

当然,可以在一个集合中存储多种类型的文档。事实上,这是像Mongo这样的面向文档的数据库的优势之一。但是,您可能不想在不考虑某些问题(正面和负面)的情况下将它们组合在一起:

  1. 您无法进行交叉收集或记录类似SQL的JOIN。因此,在一个或多个集合中包含文档不会改变该行为。
  2. 您只能在单个集合中使用聚合,因此,如果集合具有多个文档类型而不是跨集合分割,则可以更方便地执行某些聚合样式查询(聚合框架和Map-Reduce仅在一次一个集合。)
  3. 为了将文档反序列化为Morphia中的对象,您需要知道给定文档所代表的类型。您可能需要在文档中添加一个指示类型的字段,除非有其他方法可以安全地表示文档类型,以便反序列化过程正常工作。例如,Action不能是Category。如果您执行了等效的FindAll并且有多种文档类型,除非反序列化程序可以在反序列化开始之前评估文档结构,否则您的代码可能无法正常工作。
  4. 您可能需要索引文档/对象的各种属性。如果您基于文档类型进行索引(例如Action的索引与Category不一致,那么插入到包含两者的集合中的所有文档都将通过索引器运行,用于集合中定义的所有索引。可以影响性能,具体取决于索引的性质。这意味着无论索引是否有意义,集合中的所有文档都将被编入索引。这通常是组合多个文档类型的一个令人信服的理由不要分享共同的索引特征。
  5. 除非您需要执行要求所有文档都在公共集合中的特定类型的查询,否则我可能会将它们保留在单独的集合中,尤其是如果您计划对各种文档类型/模式使用自定义索引。

答案 1 :(得分:1)

是肯定的。但可能需要在任何文档中添加字段“documentType”以区分文档