我需要将具有预定义_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个对象的性能:
更好的方式将不胜感激。
答案 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;