插入具有预定义ID的对象时,Morphia会停止

时间:2013-11-18 13:27:35

标签: java mongodb morphia

我需要将具有预定义_id(Long)的对象列表插入到集合中。 AdvancedDatastore中单个对象的insert(object)方法效果很好。当我尝试使用接受Iterable的insert()方法时,麻烦就开始了。以下是一段代码示例:

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

我猜这个代码应该忽略错误(集合中已存在重复id的对象)并继续下一个项目,但事实并非如此。并且没有例外。

谢谢!

更新:

此代码插入所有元素,但不打印“1”。

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:

抱歉,代码正确完成并打印出“1”,但是比单次插入需要的时间要多得多。在我的情况下,35_000逐个插入 - 3秒,批量插入 - 100 +秒

UPDATE3:

到目前为止,解决这个问题的最佳方法是使用mongodb的本机java驱动程序。 首先,我将对象列表转换为DBObject列表:

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

然后我通过mongo数据库实例插入:

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

插入150_000个对象的性能:

  • 原生数据库插入:2-3秒
  • 通过Morphia的插入(对象):15+秒
  • 通过Morphia的插入(Iterable):400+秒

更好的方式将不胜感激。

1 个答案:

答案 0 :(得分:1)

以这种方式对我有效

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;