spring-data-mongodb之批量更新操作
时间:2022-05-06
本文章向大家介绍spring-data-mongodb之批量更新操作,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
用过mongodb的同学想必都知道,以java驱动的语法举例,插入式有insert方法的,支持插入集合,也就是批量插入。
但是update方法却只能执行一个更新条件,参数不支持传集合进去,也就意味着是不知道批量更新的。
当然原生的语法是支持的,只是驱动没有封装而已,官方文档也是推荐用db.runCommand()来实现的。
下面的语法中我们可以看到updates是个数组,可以执行多条更新语句,但是我们一般是在项目中使用,如果封装这个方法就行批量插入一样,今天我们就用spring-data-mongodb来做下封装。
首先定义一个封装更新参数的类
public class BathUpdateOptions {
private Query query;
private Update update;
private boolean upsert = false;
private boolean multi = false;
}
然后我们封装一个更新的方法,参数不同,重载多个
public static int bathUpdate(MongoTemplate mongoTemplate, String collName,
List<BathUpdateOptions> options, boolean ordered) {
return doBathUpdate(mongoTemplate.getCollection(collName), collName, options, ordered);
}
public static int bathUpdate(DBCollection dbCollection, String collName,
List<BathUpdateOptions> options, boolean ordered) {
return doBathUpdate(dbCollection, collName, options, ordered);
}
public static int bathUpdate(MongoTemplate mongoTemplate, Class<?> entityClass, List<BathUpdateOptions> options, boolean ordered) {
String collectionName = determineCollectionName(entityClass);
return doBathUpdate(mongoTemplate.getCollection(collectionName),
collectionName, options, ordered);
}
public static int bathUpdate(DBCollection dbCollection, Class<?> entityClass, List<BathUpdateOptions> options, boolean ordered) {
return doBathUpdate(dbCollection,
determineCollectionName(entityClass), options, ordered);
}
public static int bathUpdate(MongoTemplate mongoTemplate, String collName, List<BathUpdateOptions> options) {
return doBathUpdate(mongoTemplate.getCollection(collName), collName, options, true);
}
public static int bathUpdate(DBCollection dbCollection, String collName, List<BathUpdateOptions> options) {
return doBathUpdate(dbCollection, collName, options, true);
}
public static int bathUpdate(MongoTemplate mongoTemplate, Class<?> entityClass, List<BathUpdateOptions> options) {
String collectionName = determineCollectionName(entityClass);
return doBathUpdate(mongoTemplate.getCollection(collectionName),
collectionName, options, true);
}
public static int bathUpdate(DBCollection dbCollection, Class<?> entityClass, List<BathUpdateOptions> options) {
return doBathUpdate(dbCollection,
determineCollectionName(entityClass), options, true);
}
private static int doBathUpdate(DBCollection dbCollection, String collName, List<BathUpdateOptions> options, boolean ordered) {
DBObject command = new BasicDBObject();
command.put("update", collName);
List<BasicDBObject> updateList = new ArrayList<BasicDBObject>();
for (BathUpdateOptions option : options) {
BasicDBObject update = new BasicDBObject();
update.put("q", option.getQuery().getQueryObject());
update.put("u", option.getUpdate().getUpdateObject());
update.put("upsert", option.isUpsert());
update.put("multi", option.isMulti());
updateList.add(update);
}
command.put("updates", updateList);
command.put("ordered", ordered);
CommandResult commandResult = dbCollection.getDB().command(command);
return Integer.parseInt(commandResult.get("n").toString());
}
private static String determineCollectionName(Class<?> entityClass) {
if (entityClass == null) {
throw new InvalidDataAccessApiUsageException(
"No class parameter provided, entity collection can't be determined!");
}
String collName = entityClass.getSimpleName();
if(entityClass.isAnnotationPresent(Document.class)) {
Document document = entityClass.getAnnotation(Document.class);
collName = document.collection();
} else {
collName = collName.replaceFirst(collName.substring(0, 1)
,collName.substring(0, 1).toLowerCase()) ;
}
return collName;
}
核心其实就在于用collection执行command方法,然后将修语句转成DBObject对象,执行命令的方式来达到批量更新的操作。
如果使用原始的js语句来执行的话语法如下:
db.runCommand(
{
update: "article_info",
updates: [
{
q: { author: "jason" },
u: { $set: { title: "批量更新" } },
multi: true
},
{
q: { author: "yinjihuan"},
u: { $set: { title: "批量更新" }},
upsert: true
}
],
ordered: false
}
)
官方文档地址:http://docs.mongodb.org/manual/reference/command/update/#bulk-update
下面给出测试代码
List<BathUpdateOptions> list =
new ArrayList<BathUpdateOptions>();
list.add(new BathUpdateOptions(
Query.query(Criteria.where("author").is("yinjihuan")),
Update.update("title", "批量更新"), true, true));
list.add(new BathUpdateOptions(
Query.query(Criteria.where("author").is("jason")),
Update.update("title", "批量更新"), true, true));
int n = MongoBaseDao.bathUpdate(mongoTemplate, Article.class, list);
System.out.println("受影响的行数:"+n);
- CVPR2018: Unsupervised Cross-dataset Person Re-identification by Transfer Learning of Spatio-tempora
- 一个数据包消灭一台服务器的DNS漏洞
- java文件基本操作与实例
- 如何在Azkaban中安装HDFS插件以及与CDH集成
- CVE-2017-5123 漏洞利用全攻略
- sqlmap被ban了ip怎么办
- 毫秒级检测!你见过带GPU的树莓派吗?
- 达观数据对AngularJS技术的思考与实践
- hadoop配置文件
- 推荐一款src自动化扫描和收集的工具
- 蓝桥杯:兰顿蚂蚁
- 蓝桥杯:矩阵翻硬币
- PTA 字符串关键字的散列映射(25 分)
- struts2中action如何获取jsp页面参数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Jenkins部署异常:报错 TomcatManagerException: FAIL - Unable to delete
- Spring Boot打包的jar运行的时候提示:没有主清单属性
- 主流消息队列选型技术比较
- 深入浅出-网络七层模型
- 【警惕】K8S下Telnet失效陷阱
- nginx优化之keepalive
- 血泪教训,线程池引发的内存泄露
- RestTemplate设置转换类型
- 详解PROTOCOL BUFFERS
- Spring boot常用注解收集
- Go依赖模块版本之Module避坑使用详解
- 【tcl学习】vivado write_edif
- K8s中优雅停机和零宕机部署
- Python读取.edf格式脑电数据文件
- Kotlin修炼指南(三)——奇技淫巧