Java 使用Morphia在MongoDB中进行批量升级。可能吗?

Java 使用Morphia在MongoDB中进行批量升级。可能吗?,java,mongodb,import,morphia,upsert,Java,Mongodb,Import,Morphia,Upsert,我有一个由POJO实现的实体,我们称之为TestEntity,它保存在Mongo的集合中。我通过迭代CSV文件并在满足某些条件时插入或更新现有记录来生成该实体的实例。下面您可以找到我的一些代码示例 // File is parsed into an entity MongoClient client = new MongoClient("127.0.0.1", 27017); Mapper w2sMap = new Mapper(); w2sMap.addMappedClass(TestEnti

我有一个由POJO实现的实体,我们称之为
TestEntity
,它保存在Mongo的集合中。我通过迭代CSV文件并在满足某些条件时插入或更新现有记录来生成该实体的实例。下面您可以找到我的一些代码示例

// File is parsed into an entity
MongoClient client = new MongoClient("127.0.0.1", 27017);
Mapper w2sMap = new Mapper();
w2sMap.addMappedClass(TestEntity.class);
morphia = new Morphia();

Datastore datastore = morphia.createDatastore(client, w2sMap, "test");

// SaveTask implements Runnable
@Override
public void run() {
try {
   datastore.save(testEntity);
} catch (DuplicateKeyException ex) {
   if (updateConditions) // Query Mongo to find the entity, change some fields and save
   else // Log
}
SaveTask由ExecutorService通过多个线程运行,每个线程保存一个TestEntity实例。但是,一些CSV文件非常庞大,必须执行许多
保存
操作,这非常繁琐(在我的机器上大约10分钟内执行750k次保存)。一种解决方案是将
TestEntity
存储在
Iterable
集合中,并不时在集合上启动一个save任务,从而减少网络延迟并提高性能(我的实际MongoDB运行在不同的服务器上)

但是,当我尝试使用批量插入时,问题出现了,因为当发现重复密钥时,我仍然会遇到异常。我知道
new InsertOptions().continueOnError(true)
但是我需要能够一次插入文档,这将忽略重复的条目


是否存在这种情况,或者我是否需要捕获异常,找出哪些对象没有保存,并继续从那里继续?如果需要,我可以提供更好的代码示例。

您可以尝试以下几种选项:

  • 保存为0“不要等待来自服务器的确认”,即
    datastore.Save(testEntity,WriteConcern.UNACKNOWLEDGED)。这很快,但会忽略错误,因为它不会等待服务器确认
  • 您已经考虑过一次保存多个对象,但也可以尝试WriteConcern
  • 您可以使用来进行更多控制,例如:
  • DBCollection coll=db.getCollection(“用户”);
    BulkWriteOperation bulk=coll.InitializeUnderedBulkOperation();
    bulk.find(新的BasicDBObject(“z”,1)).upsert().update(新的BasicDBObject(“inc”),新的BasicDBObject(“y”,1));
    bulk.find(新的BasicDBObject(“z”,1)).upsert().update(新的BasicDBObject(“inc”),新的BasicDBObject(“y”,1));
    bulk.execute();
    
    您的示例代码没有显示如何使用upserts,但通常您应该捕获异常并自己处理它们