12

使用面向文档的数据库 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;
    ...
}

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

  • Mongo (服务器/位置)
    • 存储(数据库)
      • 对象(集合)
        • 对象(文件)
        • 目的
        • 目的
      • 类别
        • 类别
        • 类别
        • 类别
      • 行动
        • 行动
        • 行动
        • 行动

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

  • 蒙哥
    • 店铺
      • 对象
        • 目的
        • 目的
        • 目的
      • 设置
        • 类别
        • 类别
        • 类别
        • 行动
        • 行动
        • 行动
4

2 回答 2

12

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

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

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

于 2014-03-05T18:16:00.307 回答
2

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

于 2014-03-05T15:46:58.480 回答