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?

ianaz
  • 2,490
  • 3
  • 28
  • 37

2 Answers2

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.

udalmik
  • 7,838
  • 26
  • 40
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/

Prashant Thakkar
  • 1,383
  • 1
  • 12
  • 15