2014-12-30 2 views
0

Я использую Spring Data MongoDB для моего проекта. Я работаю с базой данных mongo, содержащей много данных, и я хочу сопоставить эти данные в своем приложении Java. Проблема у меня в том, что некоторые данные назад во времени имели другую структуру.Spring Mongo, отображающий переменные данные

Например sport_name является массивом сейчас, в то время как в некоторых старых записей является строка:

sport_name: "Soccer" // Old data 


sport_name: [  // Most recent entries 
    { 
     "lang" : "en", 
     "val" : "Soccer" 
    }, 
    { 
     "lang" : "de", 
     "val" : "Fussball" 
    } 
] 

Вот то, что я до сих пор:

@Document(collection = "matches") 
public class MatchMongo { 

    @Id 
    private String id; 

    private ??? sport_name; // Best way?! 

(Что не это лучший способ)/(Как бы вы справились с чем-то вроде этого?

ответ

1

Если старые данные можно рассматривать как «ан» язык, то отдельную структура может быть использована для хранения локализованного текста:

class LocalName { 
    private String language; 
    private String text; 
    // getters/setters 
} 

Так отображенный объект будет хранить коллекцию локализованных значений:

public class MatchMongo { 

    // it can also be a map (language -> text), 
    // in this case we don't need additional structure 
    private List<LocalName> names; 
} 

Этот подход можно комбинировать с пользовательскими конвертером, чтобы использовать обычную строку как «эн» значение локали:

public class MatchReadConverter implements Converter<DBObject, MatchMongo> { 

    public Person convert(DBObject source) { 
     // check what kind of data located under "sport_name" 
     // and define it as "en" language text if it is an old plain text 
     // if "sport_name" is an array, then simply convert the values 
    } 

} 

Подробное описание пользовательского сопоставления here.

1

Возможно, вы можете написать класс утилиты, который будет извлекать все данные, в которых имя sport_name не является массивом, и обновлять элемент sport_name до массива. Но все это зависит от количества данных, которые у вас есть.

Вы можете использовать запрос {"sport_name": {$ type: 2}}, здесь 2 означает String. См. Дополнительную информацию по $ type: http://docs.mongodb.org/manual/reference/operator/query/type/