0

我正在为我的项目使用 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?!

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

4

2 回答 2

1

如果旧数据可以被认为是“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
    }

}

此处详细描述了自定义映射。

于 2014-12-30T12:46:20.717 回答
1

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

您可以使用查询 {"sport_name":{$type:2}},这里 2 代表字符串。有关 $type 的更多详细信息,请参阅:http: //docs.mongodb.org/manual/reference/operator/query/type/

于 2014-12-30T13:09:36.560 回答