当前位置: 首页 > 知识库问答 >
问题:

MongoDB/Morphia中的引用

章嘉致
2023-03-14

我发现了这篇文章,其中讨论了是否应该建立文档之间的引用。我想注释我的Java类,以便在JSON文档中创建引用:

{
    "id": "3",
    "bs": [
        {
            "name": "abc"
        },
        {
            "name": "def",
            "preconditions": ["abc"]
        },
        {
            "name": "ghi",
            "preconditions":  ["abc"]
        }
    ]
}

这里,列表先决条件的对象具有对列表BS的对象的引用。在MongoDB中可能吗?它是如何被称为的(我无法使用关键字“嵌入引用”和“文档内引用”找到任何信息。)Morphia的解决方案会是什么样子?

编辑:我知道引用注释,但它似乎引用了anoter集合,而不是同一个文档中的对象列表。我只想确保序列化的java对象被正确地反序列化(两个属性都应该成为对同一个对象的引用)。

@Entity("MyAs")
public class A {
    @Id
    public String name;

    @Embedded
    public List<B> bs=new LinkedList<B>();
}
public class B {
    @Id
    public String bName;

    public List<B> preconditions=new LinkedList<B>(); 
}

在我的主要方法中,我执行以下操作:

final Datastore datastore = morphia.createDatastore(new MongoClient(), 
"Test");
B b1=new B();
b1.bName="b1";

B b2=new B();
b2.bName="b2";

b1.preconditions.add(b2);

List<B> bs=new LinkedList<B>();
bs.add(b1);
bs.add(b2);

A a1=new A();
a1.name="mya1";
a1.bs=bs;

datastore.save(a1);

A myA=datastore.get(A.class,"mya1");
System.out.println(myA.bs.get(0).preconditions.get(0));
System.out.println(myA.bs.get(0).preconditions.get(0).hashCode()+" --"  +myA.bs.get(0).preconditions.get(0).bName);
System.out.println(myA.bs.get(1));
System.out.println(myA.bs.get(1).hashCode() +" --" +  myA.bs.get(1).bName);

如果文档被反序列化(使用datastore.get),显然会为b2创建两个单独的对象(system.out.println的输出):

mongotest.B@78b729e6
2025269734 --b2
mongotest.B@6b4a4e18
1800031768 --b2

我想有一个结构,在前提条件中的b2对象引用到BS中的b2对象!

如果执行datastore.get(a.class,“mya1”);,我希望具有与序列化相同的结构:在bs列表和前提条件中引用的单个B对象。

共有1个答案

夔建章
2023-03-14

要创建该结构,只需在实体上有一个列表并用@embedded注释该字段。有关更多文档,请参见此处。

 类似资料:
  • 简短说明: 我在将mongo DB中的文档读入具有泛型属性的java类时遇到了困难。错误显示 ...但是当我试着从数据库里读... ...我得到以下异常: 我确实发现了一些关于泛型和morphia的讨论,但老实说,我不知道如何将这些应用到我的问题上。 我在运行Morphia 1.5.8

  • 我正在开发一个Java的Restful Web应用程序,并计划将MongoDB与吗啡用作ODM。由于我是MongoDB的新手,我需要一些建议。 > 处理db连接的最佳方法是使用db连接池,mongoClient负责处理。 所以我需要重用上面的数据存储,而不是在每次请求时创建一个新实例,因为它会浪费大量资源并影响性能。我应该将上述实现为单例类吗?有人能帮我解决这个问题吗?

  • 我试图使用Morphia从使用Mongo V3.6.4的mongodb.Im中读取内容。我已经添加了Morphia依赖关系: 现在我尝试连接到我的MongoDB: Mongo肯定是像我以前的连接代码一样运行...

  • 所以我开始和Morphia一起工作,我遇到了一个奇怪的问题。 get(moviedetails.class,id) 我得到null 当我使用:

  • 我已经走了这么远,但我无法找到一个很好的方法来使用模运算符在领域。

  • 问题内容: 我对mongodb和morphia相当陌生,在开始使用它之后,我意识到mongodb文档中还有一个额外的部分,该记录包含一个文件名“ ClassName”,其中包含了morphia映射的类的值。 这正常吗?我觉得这违反了数据库中数据的完整性,是否有解决的办法? 问题答案: 您可以显式禁用该属性: 如果只有一个实体类,我通常会抑制该属性。如果要对我的实体进行子类化,则将明确启用它(这是默