Ссылка в MongoDB / Morphia - PullRequest
       22

Ссылка в MongoDB / Morphia

0 голосов
/ 13 марта 2019

Я нашел этот пост , где обсуждается необходимость установления ссылок между документами.Я хочу аннотировать мой класс 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

Если документ десериализован тогда (с 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 и в предварительных условиях.

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Чтобы создать эту структуру, у вас просто будет List<B> на вашей сущности и аннотируйте это поле с помощью @Embedded.См. здесь для получения дополнительной документации.

0 голосов
/ 22 марта 2019

Я удалил свою коллекцию MonogDB и попытался запустить мой пример: теперь это похоже на работу.В предварительных условиях b указывает на объект в массиве bs.Требуется встроенная аннотация!

...