Некоторые идеи в области 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