How can I import data to Mongodb from Json file using java

后端 未结 7 816
梦如初夏
梦如初夏 2021-01-05 00:59

I am struggling with importing data into Mongodb from a Json file.
I can do the same in command line by using mongoimport command.

相关标签:
7条回答
  • 2021-01-05 01:46

    Had a similar "problem" myself and ended up using Jackson with POJO databinding, and Morphia.

    While this sound a bit like cracking a nut with a sledgehammer, it is actually very easy to use, robust and quite performant and easy to maintain code wise.

    Small caveat: You need to map your test_id field to MongoDB's _id if you want to reuse it.

    Step 1: Create an annotated bean

    You need to hint Jackson how to map the data from a JSON file to a POJO. I shortened the class a bit for the sake of readability:

    @JsonRootName(value="person")
    @Entity
    public class Person {
    
      @JsonProperty(value="test_id")
      @Id
      Integer id;
    
      String name;
    
      public Integer getId() {
        return id;
      }
    
      public void setId(Integer id) {
        this.id = id;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
    }
    

    As for the embedded document Job, please have a look at the POJO data binding examples linked.

    Step 2: Map the POJO and create a datastore

    Somewhere during your application initialization, you need to map the annotated POJO. Since you already should have a MongoClient, I am going to reuse that ;)

    Morphia morphia = new Morphia();
    morphia.map(Person.class);
    
    /* You can reuse this datastore */
    Datastore datastore = morphia.createDatastore(mongoClient, "myDatabase");
    
    /* 
     * Jackson's ObjectMapper, which is reusable, too,
     * does all the magic.
     */
    ObjectMapper mapper = new ObjectMapper();
    

    Do the actual importing

    Now importing a given JSON file becomes as easy as

    public Boolean importJson(Datastore ds, ObjectMapper mapper, String filename) {
    
        try {           
            JsonParser parser = new JsonFactory().createParser(new FileReader(filename));
            Iterator<Person> it = mapper.readValues(parser, Person.class);
    
            while(it.hasNext()) {
                ds.save(it.next());
            }
    
            return Boolean.TRUE;
    
        } catch (JsonParseException e) {
            /* Json was invalid, deal with it here */
        } catch (JsonMappingException e) {
            /* Jackson was not able to map
             * the JSON values to the bean properties,
             * possibly because of
             * insufficient mapping information.
             */
        } catch (IOException e) {
            /* Most likely, the file was not readable
             * Should be rather thrown, but was
             * cought for the sake of showing what can happen
             */
        }
    
        return Boolean.FALSE;
    }
    

    With a bit of refatcoring, this can be converted in a generic importer for Jackson annotated beans. Obviously, I left out some special cases, but this would out of the scope of this answer.

    0 讨论(0)
提交回复
热议问题