0

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?

2 Answers 2

1

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.

Sign up to request clarification or add additional context in comments.

Comments

1

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/

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.