Данные переменных отображения Spring Mongo

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

Например, 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?!

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


person ianaz    schedule 30.12.2014    source источник


Ответы (2)


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

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; 
}

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

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
    }

}

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

person udalmik    schedule 30.12.2014

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

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

person Prashant Thakkar    schedule 30.12.2014