Принудительный порядок свойств в отображении Spring Data MongoDB

#java #spring #mongodb #spring-data

#java #spring #mongodb #spring-данные

Вопрос:

У меня есть объект Location, который мне нужен для принудительного изменения порядка свойств, когда они сохраняются в mongodb, но мне не очень повезло выяснить, как это сделать. Класс Location выглядит примерно так:

 Location {
   float lat;
   float lon;
   County county;
}
  

Когда он сохраняется в mongo, округ всегда стоит перед широтой и lon. Это проблема, потому что я пытаюсь поместить в нее геоиндекс, и первые два свойства должны быть широтными / длинными.

Я пытался:

 @XmlRootElement(name="location")
@XmlType(propOrder={"latitude", "longitude", "county"})
Location {
   float lat;
   float lon;
   County county;
}
  

Это работает, когда объект location сериализуется в xml для моего клиента, но не для базы данных. Кажется, что spring data или какой-либо другой картограф mongo всегда выполняет действия в алфавитном порядке.

Кто-нибудь знает, как принудительно сохранить свойства порядка в mongo? Спасибо!

Ответ №1:

Вы можете использовать атрибут order аннотации @Field для принудительного упорядочения полей. Итак, если у вас есть:

 Location {
   @Field(order = 1)
   float lat;

   @Field(order = 2)
   float lon;

   @Field(order = 3)
   County county;
}
  

поля сохраняются в следующем порядке: широта, lon, округ.

Комментарии:

1. Это было исправлено для проблемы, которую я отправил, поэтому я принимаю ваш ответ. Спасибо за обновление! На самом деле я закончил тем, что сделал что-то другое, что я добавлю.

Ответ №2:

Чтобы все знали, я разговаривал с разработчиками Spring, и они попросили меня отправить JIRA для решения проблемы, потому что сейчас нет способа сделать это прямо сейчас. JIRA можно найти здесь: https://jira.springsource.org/browse/DATADOC-172

Комментарии:

1. Должно быть исправлено с помощью последнего ночного снимка.

Ответ №3:

Неясно, что вы используете для преобразования из вашего POJOs в MongoDB. Картографам нравится Morphia (http://code.google.com/p/morphia ) будет использовать порядок полей, объявленный в вашем классе. Также существуют варианты управления этим различными способами.

Если это проблема с Spring Data (framework), я бы посоветовал обратиться к их форумам за поддержкой.

Комментарии:

1. Да, он использует Spring Data (как указано в названии), и пробовал там, но пока никаких ответов, поэтому хотел попытать счастья в stackoverflow. Спасибо

2. Мне было бы интересно, как Morphia реализует «порядок полей, объявленный в вашем классе», поскольку JavaDoc для Class.GetFields() явно не гарантирует определенный порядок. Таким образом, можно получить разный порядок полей на разных виртуальных машинах и даже не следует полагаться на постоянство порядка для одной виртуальной машины.

Ответ №4:

Для полноты картины я в итоге создал точечный объект, содержащий широту / длину, и проиндексировал этот объект. Таким образом, это была единственная вещь в объекте, и порядок не имел значения.

В связи с этим, только сегодня я узнал, что если вы собираетесь выполнять пространственные запросы, вы ДОЛЖНЫ хранить свои свойства в следующем порядке: Долгота, Широта. Вы можете посмотреть здесь для получения дополнительной информации, но сегодня я некоторое время бился головой об стену с этим, поэтому, если вы сохраняете точки для геозапросов, убедитесь, что они расположены у вас в правильном порядке. Все это означает, что вы ставите долготу на первое место в своем классе. Я полагаю, вы могли бы также пометить их атрибутом @Field.