Java 使用Morphia在MongoDB中进行批量升级。可能吗?
我有一个由POJO实现的实体,我们称之为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
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)
但是我需要能够一次插入文档,这将忽略重复的条目
是否存在这种情况,或者我是否需要捕获异常,找出哪些对象没有保存,并继续从那里继续?如果需要,我可以提供更好的代码示例。您可以尝试以下几种选项:
datastore.Save(testEntity,WriteConcern.UNACKNOWLEDGED)代码>。这很快,但会忽略错误,因为它不会等待服务器确认
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,但通常您应该捕获异常并自己处理它们