java - Morphia 在插入具有预定义 ID 的对象时停止

标签 java mongodb morphia

我需要将具有预定义 _id(长整型)的对象列表插入到集合中。 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();
}

更新2:

抱歉,代码正确完成并打印出“1”,但它比单次插入花费的时间多得多。在我的例子中,35_000 逐一插入 - 3 秒,批量 - 100+ 秒

更新3:

到目前为止,对我来说处理这个问题的最好方法是为 mongodb 使用 native java 驱动程序。 1st 我将我的对象列表转换为 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 的 insert(object):15 秒以上
  • 通过 Morphia 的插入(可迭代):400+ 秒

我们将不胜感激。

最佳答案

它对我来说是这样的

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;

关于java - Morphia 在插入具有预定义 ID 的对象时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20048983/

相关文章:

java - Java中泛型类型的实际返回类型是什么?

java - 将投影添加到吗啡查询

java - com.android.dex.DexException:多个dex文件定义了Lcom/google/android/gms/location/places/PlaceReport;

java - Hibernate NOT IN 子查询

Java 加密 AES 函数

mongodb - save 在 pymongo 中被弃用了?

javascript - 如何在 Mongoose 中检索子文档

javascript - 如何解决 "TypeError: callback.apply is not a function"?

mongodb - 在 Morphia 全文搜索中包含分数

java - 有没有办法在没有 org.bson.types.ObjectId 的情况下使用 Mongo/Morphia ?