我有一个对mongo数据库执行批量写入操作的方法,它可以按预期工作。
问题是,由于较新的版本支持mongoClient.getDB()
,我收到了mongoClient.getDatabase()
引起的弃用警告。
使用DB
,我可以得到初始化无序批量操作等所需的DBCollection
。使用mongoClient.getDatabase()
,将返回MongoCollection,这不是我所需要的。
有没有一种方法可以解决此过时警告而不抑制它?我的意思是,如果有一种使用getDatabase()
的方式,然后将MongoCollection
转换为DBCollection
,但是我的批量操作是否仍然有效?
或者,如果有人可以使用bulkSaveOrUpdate()
而不是MongoCollection
给出DBCollection
的转换代码,那就太好了。
下面是bulkSaveOrUpdate()
方法的代码。
方法:
@SuppressWarnings("deprecation")
private <T> void bulkSaveOrUpdate(List<? extends BaseModel> items) {
String databaseName = m_mongoTemplate.getDb().getName();
String collectionName = m_mongoTemplate.getCollectionName(items.get(0).getClass());
DB db = m_mongoClient.getDB(databaseName);
DBCollection collection = db.getCollection(collectionName);
BulkWriteOperation bulkOps = collection.initializeUnorderedBulkOperation();
MongoConverter converter = m_mongoTemplate.getConverter();
try{
BasicDBObject dbObject;
for (BaseModel item : items) {
if(item.getId() == null){
item.setId(new ObjectId() + "");
dbObject = new BasicDBObject();
converter.write(item, dbObject);
bulkOps.insert(dbObject);
} else {
dbObject = new BasicDBObject();
converter.write(item, dbObject);
BasicDBObject query = new BasicDBObject();
query.put("_id", dbObject.get("_id"));
BulkWriteRequestBuilder writeRequest = bulkOps.find(query);
BulkUpdateRequestBuilder updateReq = writeRequest.upsert();
updateReq.replaceOne(dbObject);
}
}
bulkOps.execute();
} catch (Exception e) {
_LOG.error("Bulk upsert failed :: ", e.getMessage());
}
}
答案 0 :(得分:0)
您应该使用T扩展客户而不是T
答案 1 :(得分:0)
为了通知编译器您打算使用从超类(即您的客户类)继承特定字段和方法的对象来填充集合,您可以使用:
Collection<T extends Customer> items
这告诉编译器,无论您将什么对象放入集合中,它始终具有Customer类中包含的字段和方法。
希望这可以提供更多的清晰度!