Rahim
Rahim

Reputation: 740

Morphia stops when inserting objects with predefined ids

I need to insert a list of objects with a predefined _id (Long) into a collection. insert(object) method for a single object from AdvancedDatastore works great. The trouble begins when i try to use the insert() method which accepts an Iterable. Here is a sample piece of code:

try {
  advancedDatastore.insert("collection_name", feeds, WriteConcern.ERRORS_IGNORED);
} catch (Exception e) {
  e.printStackTrace();
}

I guess that this code is supposed to ignore errors (an object with a duplicate id already exists in the collection) and just continue with the next item, but it does not. And no exception is raised.

Thanks!

Update:

This code inserts all the elements, but "1" is not printed out.

try {
  System.err.println(0);
  advancedDatastore.insert("collection_name", feeds, WriteConcern.ERRORS_IGNORED.continueOnErrorForInsert(true));
  System.err.println(1);
} catch (Exception e) {
  e.printStackTrace();
}

Update2:

Sorry, the code completes properly and "1" is printed out, but it takes tremendously more time than single inserts. In my case 35_000 inserts 1 by one - 3 seconds, in batch - 100+ seconds

Update3:

So far the best way to deal with the issue for me is to use native java driver for mongodb. 1st I convert my object list to DBObject list:

final List<DBObject> dbObjects = new ArrayList<DBObject>();
for (MyObject object: objectList) {
    dbObjects.add(morphia.toDBObject(object));
}

Then I insert through mongo DB instance:

db.getCollection("collection_name").insert(dbObjects, WriteConcern.UNACKNOWLEDGED.continueOnErrorForInsert(true));

Performace for inserting 150_000 objects:

A better way would be appreciated.

Upvotes: 2

Views: 608

Answers (1)

jhonatan L M
jhonatan L M

Reputation: 11

It works to me in this way

final List<DBObject> dbObjects = new ArrayList<DBObject>();
        try {
            TypedQuery<RegistroCivil> consulta = em.createQuery("select p from RegistroCivil p", RegistroCivil.class);
            List<RegistroCivil> lista = consulta.getResultList();
            for (RegistroCivil object : lista) {
                dbObjects.add(morphia.toDBObject(object));
            }
            long start = System.currentTimeMillis();
            ds.getCollection(RegistroCivil.class).insert(dbObjects);
            //ds.save(lista);
            long end = System.currentTimeMillis();
            tmongo = end - start;

Upvotes: 1

Related Questions