Атрибут id во вложенном Java-классе, отображенный как MongoDb ObjectId () - PullRequest
0 голосов
/ 25 июня 2018

Следующая структура:

@Document 
public class Palace {
    @Id
    private String id;
    private Location location;
    // additional attributes, getter, setter 
}

.

public class Location {
    private String id;
    // additional attributes, getter, setter
}

Насколько я понимаю концепцию ObjectId, в документе MongoDB может быть только один ObjectId (_id), и он должен находиться на корневом уровне документа.Но при вставке данных через Spring Boot 1.5.14 я получаю следующую структуру:

{
    "_id" : ObjectId("5b05387a8db58e0001d38851"),
    "location" : {
        "_id" : ObjectId("5ae712d1b2b197000132cd9b"),
    }
}

Мой вопрос: это ожидаемое поведение в spring-data-mongo?Я ожидал бы следующую структуру:

{
    "_id" : ObjectId("5b05387a8db58e0001d38851"),
    "location" : {
        "id" : "5ae712d1b2b197000132cd9b",
    }
}

Если я аннотирую Идентификатор местоположения с помощью @ Field

public class Location {
    @Field("id")
    private String id;
    // additional attributes, getter, setter
}

, тогда Документ сохраняется, как и ожидалось, но запрашивается с помощью метода репозитория

getPalaceByLocationId()

не даст никаких результатов.

1 Ответ

0 голосов
/ 26 июня 2018

Некоторые идеи в области id.Поле id обрабатывается немного по-другому в spring-data-mongodb.

Ознакомьтесь с документацией .

Расширение документации для вашего случая, когда вы объявляете идентификатор, подобный этому

public class Location {
    private String id;
    // additional attributes, getter, setter
}

Он хранится как_id в базе данных.Вы можете перепроверить, заглянув в базу данных.То же самое верно, когда вы аннотируете его с помощью @Id

{
    "_id" : ObjectId("5b31fad36a19cc45db205056"),
    "location" : {
        "_id" :  ObjectId("5ae712d1b2b197000132cd9b")
    }
}

5ae712d1b2b197000132cd9b - это идентификатор, который вы установили с помощью location.setId().Внутренне он преобразуется в ObjectId и сохраняется как _id.

Но когда вы добавляете аннотацию @Field, все меняется.Предположим, вы добавили аннотацию, подобную этой:

@Field("id")
private String id;

Тогда документ выглядит так в базе данных.

{
    "_id" : ObjectId("5b31fad36a19cc45db205056"),
    "location" : {
        "id" :  "5ae712d1b2b197000132cd9b"
    }
}

С этим проблема в том, что вы не можете получить по идентификатору.Потому что когда вы пишете findPalaceByLocationId или findByLocation_Id, он (spring-data) пытается найти поле _id, которого не существует.

Единственный способ обойти это просто использовать его вот так

@Field
private String id;

или просто

private String id;

Это создаст _id в базе данных, и вы можете сделать findByLocationId

Я знаю, это немного отрывочно.Но вот как это работает.

И относительно

Насколько я понимаю концепцию ObjectId, в документе MongoDB может быть только один ObjectId (_id), и он должен находиться на корневом уровнедокумент.

, что неверно.

Небольшая информационная таблица относительно отображения

Field definition         Resulting Id-Fieldname in MongoDB  

String id                      _id  
@Field String id               _id  
@Field('x') String id           x    
@Field('id') String id          id (InAccessible)   
@Id String x                   _id  
@Field('x') @Id String x       _id 
...