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



使用文档数据库mongoDB和Object Document Mapper (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 (服务器/位置)存储(数据库)对象(
    • 集合)
        • 对象(文档)
        • 对象
        • 对象
      • 类别
        • 分类
        • 分类
        • 分类
      • 行动
        • 行动
        • 行动
        • 行动

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

  • 蒙戈
    • 商店
      • 对象
        • 对象
        • 对象
        • 对象
      • 设置
        • 分类
        • 分类
        • 分类
        • 行动
        • 行动
        • 行动

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

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

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

是的。 但可能需要向任何文档添加字段"documentType"以区分文档

最新更新