4

I am trying to insert a json string which contains an array of documents but getting following exception.

MongoDB server version: 3.0.6

Mongo-Java driver version: 3.1.0

I understand that insertOne() method is used to insert just one document but over here it's an array of documents. I am not sure how to use insertMany() method here.

Please guide.

JSON String that I want to insert:

json = [{"freightCompanyId":201,"name":"USPS","price":8.00},{"freightCompanyId":202,"name":"FedEx","price":10.00},{"freightCompanyId":203,"name":"UPS","price":12.00},{"freightCompanyId":204,"name":"Other","price":15.00}]

Exception Log:

Exception in thread "main" org.bson.BsonInvalidOperationException: readStartDocument can only be called when CurrentBSONType is DOCUMENT, not when CurrentBSONType is ARRAY.
    at org.bson.AbstractBsonReader.verifyBSONType(AbstractBsonReader.java:655)
    at org.bson.AbstractBsonReader.checkPreconditions(AbstractBsonReader.java:687)
    at org.bson.AbstractBsonReader.readStartDocument(AbstractBsonReader.java:421)
    at org.bson.codecs.DocumentCodec.decode(DocumentCodec.java:138)
    at org.bson.codecs.DocumentCodec.decode(DocumentCodec.java:45)
    at org.bson.Document.parse(Document.java:105)
    at org.bson.Document.parse(Document.java:90)
    at com.ebayenterprise.ecp.jobs.Main.insert(Main.java:52)
    at com.ebayenterprise.ecp.jobs.Main.main(Main.java:31)

Main.java

public class Main {

    private static final Logger LOG = Logger.getLogger(Main.class);

    public static void main(String[] args) throws IOException {
        String json = getAllFreightCompanies();
        insert(json);
    }

    private static String getAllFreightCompanies() throws IOException {
        FreightCompanyDao freightCompanyDao = new FreightCompanyDaoImpl(DataSourceFactory.getDataSource(DatabaseType.POSTGRES.name()));
        List<FreightCompany> freightCompanies = freightCompanyDao.getAllFreightCompanies();
        return GenericUtils.toJson(freightCompanies);
    }

    private static void insert(String json) {
        MongoClient mongoClient = new MongoClient("GSI-547576", 27017);
        MongoDatabase database = mongoClient.getDatabase("test");
        MongoCollection<Document> table = database.getCollection("fc");
        Document document = Document.parse(json);
        table.insertOne(document);
    }

}

GenericUtils.java

public final class GenericUtils {

    private static final Logger LOG = Logger.getLogger(GenericUtils.class);

    private GenericUtils() {
    }

    public static String toJson(List<FreightCompany> freightCompanies) throws IOException {
        String json = new ObjectMapper().writer().writeValueAsString(freightCompanies);
        LOG.debug("json = " + json);
        return json;
    }

}

pom.xml

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.1.0</version>
    <type>jar</type>
</dependency>
<dependency>
   <groupId>org.codehaus.jackson</groupId>
   <artifactId>jackson-mapper-asl</artifactId>
   <version>1.9.13</version>
</dependency>
2
  • should each freight company be in a different document ? Commented Nov 3, 2015 at 17:07
  • Not a big MongoDB user but to mention in RDBMS terms; each freight company should be in a different row. Commented Nov 3, 2015 at 17:14

1 Answer 1

5

You should either insert one by one or create a List of documents and use insertMany()

Here's an example:

MongoClient mongoClient = new MongoClient("GSI-547576", 27017);
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection < Document > table = database.getCollection("fc");
FreightCompanyDao freightCompanyDao = new FreightCompanyDaoImpl(DataSourceFactory.getDataSource(DatabaseType.POSTGRES.name()));
List < FreightCompany > freightCompanies = freightCompanyDao.getAllFreightCompanies();

for (FreightCompany company: freighetCompanies) {
    Document doc = Document.parse(GenericUtils.toJson(company))
    collection.insertOne(doc)
}
Sign up to request clarification or add additional context in comments.

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.