gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:25:53 30 4
gpt4 key购买 nike

使用面向文档的数据库 mongodb 和 Object Document Mapper (ODM) morphia

假设我们有 3 个不同的类; ObjectCategoryAction
这些对象都存储在集合中;对象、类别和 Action 。

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

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

  • 蒙古
    • 商店
      • 对象
        • 对象
        • 对象
        • 对象
      • 设置
        • 类别
        • 类别
        • 类别
        • Action
        • Action
        • Action

最佳答案

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

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

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

关于mongodb - 是否可以将多种类型的对象存储到 1 个 mongodb 集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22202394/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com