MongoDB / Morphia中的参考

时间:2019-03-13 15:09:58

标签: java mongodb morphia

我在讨论此post的地方找到了是否应该在文档之间建立引用的地方。我想注释我的Java类,以便在JSON文档中创建引用:

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

此处,列表前提条件的对象具有对列表bs的对象的引用。 MongoDB中有可能吗?怎么称呼(我无法使用关键字“嵌入式参考”和“文档中的参考”找到任何信息。)morphia的解决方案看起来如何?

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

编辑II:为了澄清我的问题,我提供了用于测试的代码:

A级

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

    @Embedded
    public List<B> bs=new LinkedList<B>();
}

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);

这导致Mongo DB Compass中的以下结构(显然,未创建引用): enter image description here

如果将文档反序列化(然后使用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对象。

2 个答案:

答案 0 :(得分:2)

要创建 that 结构,您只需在实体上放置一个List<B>,然后使用@Embedded对该字段进行注释。有关更多文档,请参见here

答案 1 :(得分:0)

我删除了我的MonogDB集合,并尝试运行我的示例:现在看来可以了。前提条件中的b引用bs数组中的对象。嵌入式注释是必需的!