本次升级是2019年12月底完成. 升级过程中发现百度到的内容十分有限,
大部分时候都是翻看官方文档. 因此考虑写一篇文章帮助后来者.
本文仅供需要尝鲜的用户/企业做一个参考. 如有错误, 请指正.
本文为原创文章, 转载请注明出处.
<dependency>
<groupId>org.mongodbgroupId>
<artifactId>mongo-java-driverartifactId>
<version>3.12.0version>
dependency>
<dependency>
<groupId>org.springframework.datagroupId>
<artifactId>spring-data-mongodbartifactId>
<version>2.2.3.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
<version>5.2.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.2.2.RELEASEversion>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-annotationsartifactId>
<version>2.10.1version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
<version>2.10.1version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.10.1version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrsgroupId>
<artifactId>jackson-jaxrs-json-providerartifactId>
<version>2.10.1version>
dependency>
启动项目发现全局编译报错, 原因是:
spring-data 提供的 mongoTemplate 的很多方法 (API) 变了, 没有做过时处理, 而是直接硬性的移除/变更了.
这就很要命了, 于是又去查看官方文档, 根据官方文档的说辞, 把报错的地方进行修改. 下面举例子
// 旧代码 WriteResult 已经没有了。
WriteResult wr = this.mongoTemplate().updateMulti();
int n = writeResult.getN();
// 新版的api updateResult 提供了
UpdateResult result = this.mongoTemplate.updateMulti(query, update, "xxx_connection");
result.getModifiedCount(); // 更改的数量
result.getMatchedCount(); // 匹配的数量
Query query = new Query();
query.with(Sort.by(new Sort.Order(Sort.Direction.DESC, form.getSort())));
Query query= new Query();
query.with(Sort.by(form.getSort()).descending()); // 倒序
query.with(Sort.by(form.getSort()).ascending()); // 正序
// 针对name属性进行升序
Query query= new Query();
query.with(Sort.sort(XxxEntity.class).by(XxxEntity:: getName).ascending());
DBCursor = mongoTemplate.getCollection("xxx_connection_name")find(query.getQueryObject());
dbCursor.addOption(16);
while (dbCursor.hasNext()) {
Map repaymentInfo= dbCursor.next().toMap();
map = new HashMap<>();
map.put("身份证号",GetterUtil.getString(repaymentInfo.get("idNo")));
// ...
}
dbCursor.close();
经测试,以下第一种也是可以迅速返回,不会产生大数据量时候的阻塞情况,同时Query对象有对cursor超时时间进行设置的api => noCursorTimeout()
CloseableIterator<HashMap> iterator = mongoTemplate.stream(query,
HashMap.class, "xxx_connection_name");
while(iterator.hasNext()){
// ...
}
FindIterable<Document> documents =
mongoTemplate.getCollection("lxcs_spdb_interface_sendorder_job").find();
documents.noCursorTimeout(false);
while(documents.iterator().hasNext()){
// ...
}
这种方案适用于 原代码中 对于游标循环出以后toMap的写法,改动较小
// 旧版代码
DBCursor dbCursor = mongoTemplate.getCollection("xxx_connection_name").find(query.getQueryObject());
while (dbCursor.hasNext()) {
Map map = dbCursor.next().toMap();
}
// --------------------------------------------------
// 新版代码 document本身是implements了Map
MongoCursor<Document> cursor = mongoTemplate.getCollection("xxx_connection_name").find().cursor();
while (cursor.hasNext()) {
Map map = cursor.next();
}
cursor.close();
DBObject group = (DBObject) JSON.parse("{}");
AggregationOperation aggregationOperationGroup = new AggregationOperation() {
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return group;
}
};
// ...
Document group = Document.parse("{}");
AggregationOperation aggregationOperationGroup = new AggregationOperation() {
@Override
public Document toDocument(AggregationOperationContext context) {
return group;
}
};
// ...
此时, 单纯的mongodb就搞定了.
但是 为什么我说的是单纯的mongodb, 因为… 我们项目中还用到了elasticsearch, 版本是2.4.6, 并且整合了spring-data-elasticsearch
升级了spring-data-mongodb, 那么很明显的问题就是, 对应支持es的spring-data也需要升级, 否则其依赖的spring-data-common包会报错找不到某些方法/枚举之类的问题.
下一篇文章我再详细讲解elasticsearch的升级.