ianaz
ianaz

Reputation: 2580

Spring Mongo mapping variable data

I'm using Spring Data MongoDB for my project. I work with a mongo database containing a lot of data, and I want to map this data within my Java application. The problem I have is that some data back in time had a different structure.

For example sport_name is an array now, while in some old records is a String:

sport_name: "Soccer" // Old data


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

Here is what I have until now:

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

    @Id
    private String id;

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

(What's the best way to)/(How would you) handle something like this?

Upvotes: 0

Views: 929

Answers (2)

Prashant Thakkar
Prashant Thakkar

Reputation: 1403

Probably you can write a utility class which will fetch all the data where sport_name is not an array and update the element sport_name to array. But this all depends on the amount of data you have.

You can use query {"sport_name":{$type:2}}, here 2 stands for String. Refer for more details on $type: http://docs.mongodb.org/manual/reference/operator/query/type/

Upvotes: 1

udalmik
udalmik

Reputation: 7988

If old data can be considered as "en" language, then separate structure can be used to store localized text:

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

So mapped object will store the collection of localized values:

public class MatchMongo {

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

This approach can be combined with custom converter, to use plain string as "en" locale value:

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
    }

}

Custom mapping is described here in details.

Upvotes: 1

Related Questions