能否将多种类型的对象存储到一个MongoDB集合中?

12

使用面向文档数据库 MongoDB 和对象文档映射器(ODM)Morphia

假设我们有3个不同的类:ObjectCategoryAction
这些对象都存储在集合中:objects、categories 和 actions。

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 (服务器/位置)
    • 存储(数据库)
      • 对象(集合)
        • 对象(文档)
        • 对象
        • 对象
      • 分类
        • 类别
        • 类别
        • 类别
      • 操作
        • 操作
        • 操作
        • 操作

是否可以在一个集合中存储两个不同的对象,比如下面的例子所示,分别是CategoryAction,并且各自具有自己的标识符!

  • Mongo
    • 存储
      • 对象
        • 对象
        • 对象
        • 对象
      • 设置
        • 类别
        • 类别
        • 类别
        • 操作
        • 操作
        • 操作
2个回答

12
当然可以将多种类型的文档存储在单个集合中。实际上,这是像Mongo这样的文档导向数据库的优点之一。但是,在考虑某些问题(正面和负面)之前,您可能不希望将它们组合起来:
  1. 无法进行跨集合或文档的SQL-like JOIN。因此,将一个或多个文档放在一个集合中也不会改变这种行为。
  2. 仅能在单个集合中使用聚合,因此如果一个集合具有多个文档类型而不是分散在不同的集合中,则可以更方便地执行一些聚合风格的查询(聚合框架和Map-Reduce仅在一次操作一个集合时运行)。
  3. 为了将文档反序列化为Morphia中的对象,您需要知道给定文档表示的类型。您可能需要向文档添加指示类型的字段,除非有其他安全地表示文档类型的方法,以便反序列化过程能够正确工作。例如,Action不能是Category。如果您执行了等效于FindAll的操作并且存在多个文档类型,除非反序列化器可以在反序列化开始之前评估文档结构,否则您的代码可能无法按预期工作。
  4. 您可能需要对文档/对象的各种属性进行索引。如果您基于文档类型建立索引(例如,Action具有与Category不同的唯一索引),则放入同时包含它们的集合中的所有文档都将通过索引器运行,并针对集合中定义的所有索引进行索引。这可能会影响性能,具体取决于索引本质。这意味着无论索引是否有意义,集合中的所有文档都将被索引。这通常是不将没有共同索引特征的多个文档类型组合在一起的令人信服的原因。
除非需要执行需要所有文档位于公共集合中的特定类型查询,否则最好将它们保留在单独的集合中,特别是如果您计划为各种文档类型/模式使用自定义索引。

2
是的,但是您可能需要向任何文档添加“documentType”字段以区分文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接