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

Mar*_*cel 7 document-oriented-db mongodb morphia

使用文档oriënted数据库mongodb和Object Document Mapper(ODM)morphia

可以说我们有3个不同的类; Object,CategoryAction.
这些对象都存储在集合中; 对象,类别和动作.

Category并且Action是参考Object

@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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • Mongo (服务器/位置)
    • 商店(数据库)
      • 对象(集合)
        • 对象(文件)
        • 宾语
        • 宾语
      • 类别
        • categorie
        • categorie
        • categorie
      • 行动
        • 行动
        • 行动
        • 行动

是否有可能存储2个不同的对象,在这种情况下Category,并Action在一个集合,像显示在下面的例子?两者都有自己的身份!

  • 蒙戈
    • 商店
      • 对象
        • 宾语
        • 宾语
        • 宾语
      • 设置
        • categorie
        • categorie
        • categorie
        • 行动
        • 行动
        • 行动

Wir*_*rie 9

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

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

除非您需要执行需要将所有文档放在公共集合中的特定类型的查询,否则我可能会将它们保留在单独的集合中,尤其是如果您计划对各种文档类型/模式使用自定义索引.