Я нашел этот пост , где обсуждается необходимость установления ссылок между документами.Я хочу аннотировать мой класс Java
так, чтобы были созданы ссылки в документах JSON
:
{
"id": "3",
"bs": [
{
"name": "abc"
},
{
"name": "def",
"preconditions": ["abc"]
},
{
"name": "ghi",
"preconditions": ["abc"]
}
]
}
Здесь объекты предусловий списка имеют ссылки на объекты списка bs.Это возможно в MongoDB
?Как это называется (мне не удалось найти какую-либо информацию с помощью ключевых слов «встроенная ссылка» и «ссылка в документах».) Как будет выглядеть решение с morphia ?
РЕДАКТИРОВАТЬ:Я знаю аннотацию reference , но, похоже, она относится к коллекции anoter, а не к списку объектов в одном документе.Я просто хочу убедиться, что сериализованные объекты 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](https://i.stack.imgur.com/Idp4G.png)
Если документ десериализован тогда (с datastore.get), очевидно, для b2 создаются два отдельных объекта(выходные данные System.out.println
):
mongotest.B@78b729e6
2025269734 --b2
mongotest.B@6b4a4e18
1800031768 --b2
Я хочу иметь структуру, в которой объект b2 в предварительных условиях ссылается на объект b2 в bs!
Если я сделаю datastore.get(A.class,"mya1");
Iхочу иметь ту же структуру, которую я использовал для сериализации: один объект B, на который есть ссылка в списке bs и в предварительных условиях.