Spring Mongo映射变量数据

Spring Mongo映射变量数据,spring,mongodb,spring-mongo,spring-mongodb,Spring,Mongodb,Spring Mongo,Spring Mongodb,我在我的项目中使用SpringDataMongoDB。我使用一个包含大量数据的mongo数据库,我想在Java应用程序中映射这些数据。 我遇到的问题是,过去的一些数据具有不同的结构 例如,sport\u name现在是一个数组,而在一些旧记录中是一个字符串: sport_name: "Soccer" // Old data sport_name: [ // Most recent entries { "lang" : "en", "val

我在我的项目中使用SpringDataMongoDB。我使用一个包含大量数据的mongo数据库,我想在Java应用程序中映射这些数据。 我遇到的问题是,过去的一些数据具有不同的结构

例如,sport\u 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?!

(最好的方法是什么)/(您会如何)处理这样的事情?

如果可以将旧数据视为“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; 
}
公共类MatchMongo{
//它也可以是地图(语言->文本),
//在这种情况下,我们不需要额外的结构
私人名单名称;
}
此方法可以与自定义转换器相结合,以使用纯字符串作为“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
    }

}
公共类MatchReadConverter实现转换器{
公共人物转换(DBObject源){
//检查“运动名称”下的数据类型
//如果是旧的纯文本,则将其定义为“en”语言文本
//如果“sport_name”是一个数组,则只需转换值即可
}
}

详细描述了自定义映射。

可能您可以编写一个实用程序类,用于获取sport\u name不是数组的所有数据,并将元素sport\u name更新为数组。但这一切都取决于您拥有的数据量

您可以使用查询{“sport_name”:{$type:2},这里2代表字符串。 有关$type的更多详细信息,请参阅: