Я работаю в Spring Boot с проектом Spring Data MongoDB, и я вижу поведение, о котором я не знаю. Я понимаю, что поле id будет находиться в _id в репозитории Mongo за http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mapping.conventions.id-field. Моя проблема заключается в том, что это также происходит для дочерних объектов, которые не кажутся правильными.Обработка полей Id в Spring Data Mongo для дочерних объектов
Например, у меня есть эти классы (выезд из сеттеров и добытчиками для краткости):
public class MessageBuild {
@Id
private String id;
private String name;
private TopLevelMessage.MessageType messageType;
private TopLevelMessage message;
}
public interface TopLevelMessage {
public enum MessageType {
MapData
}
}
public class MapData implements TopLevelMessage {
private String layerType;
private Vector<Intersection> intersections;
private Vector<RoadSegment> roadSegments;
}
public class RoadSegment {
private int id;
private String name;
private Double laneWidth;
}
и создать объектный граф с помощью этого я использую соответствующий класс MongoRepository, чтобы сохранить я в конечном итоге с примером документа как это (с _class опущены):
{
"_id" : ObjectId("57c0c05568a6c4941830a626"),
"_class" : "com.etranssystems.coreobjects.persistable.MessageBuild",
"name" : "TestMessage",
"messageType" : "MapData",
"message" : {
"layerType" : "IntersectionData",
"roadSegments" : [
{
"_id" : 2001,
"name" : "Road Segment 1",
"laneWidth" : 3.3
}
]
}
}
в этом случае дочерний объект с именем поля идентификатора имеет свое отображение преобразуется в _ID в хранилище MongoDB. Не конец света, хотя и не ожидаемый. Самая большая проблема заключается в том, что это показывается REST MVC, поля _id не возвращаются из запроса. Я попытался установить exposeIdsFor в моем RepositoryRestConfigurerAdapter для этого класса, и он предоставляет идентификатор для документа верхнего уровня, но не для дочерних.
Так кружась вокруг 2 вопросов/проблем я являются:
- Почему поля объекта ребенка, отображенных в _ID? Я понимаю, что это должно произойти только на верхнем уровне, так как вещи, находящиеся под ними, на самом деле не являются документами.
- Не должно ли конфигурация выставлять поля id для дочерних объектов в документе, если они сопоставляют имена полей?
Для меня это имеет смысл только в документе верхнего уровня. Почему дочерние объекты, являющиеся лишь частью документа, переводили свои значения? –
Также в документации указано, что «MongoDB требует, чтобы у вас было поле _id для всех документов», а дочерние объекты НЕ являются документами. Они являются частью документа, который вставлен. –
Вы отказались от меня (никаких тяжелых чувств, я согласен, я не ответил «почему»), но для записи я согласен, что это имеет смысл только на верхнем уровне. Это может быть ошибкой? – alexbt