Spring Boot中如何实现MongoDB的$pull正则匹配数组元素操作?
在Spring Boot中实现MongoDB的$pull+$in正则匹配操作
你之前的方法失效是因为pullAll是精确匹配数组元素,不管传入字符串形式的正则还是Pattern对象,都会被当作字面量去匹配数组里的值,而不是作为正则条件执行匹配,自然找不到对应元素。
要实现MongoDB Compass中db.documentName.updateMany({}, {$pull:{arrayField:{$in:[/^aaa$/i,/^bbb$/i]}}})的效果,需要用Update.pull()方法结合MongoDB的查询操作符来构建条件,以下是两种可行的实现方式:
方式一:使用Criteria构建条件
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import java.util.regex.Pattern; // 构建空查询(匹配所有文档) Query query = new Query(); Update update = new Update(); // 构建包含两个全匹配、不区分大小写正则的$in条件 Criteria regexCriteria = Criteria.where("").in( Pattern.compile("^aaa$", Pattern.CASE_INSENSITIVE), Pattern.compile("^bbb$", Pattern.CASE_INSENSITIVE) ); // 将条件传入pull方法,指定要操作的数组字段 update.pull("arrayField", regexCriteria.getCriteriaObject()); // 执行批量更新 mongoTemplate.updateMulti(query, update, YourEntityClass.class);
方式二:直接使用MongoDB原生DBObject
import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import java.util.regex.Pattern; Query query = new Query(); Update update = new Update(); // 构建正则列表 BasicDBList regexList = new BasicDBList(); regexList.add(Pattern.compile("^aaa$", Pattern.CASE_INSENSITIVE)); regexList.add(Pattern.compile("^bbb$", Pattern.CASE_INSENSITIVE)); // 直接构造$in条件传入pull update.pull("arrayField", new BasicDBObject("$in", regexList)); mongoTemplate.updateMulti(query, update, YourEntityClass.class);
说明
两种方式本质都是构造出和Compass中一致的MongoDB命令:{$pull:{arrayField:{$in:[正则1,正则2]}}},这样MongoDB会遍历数组元素,用正则条件匹配并移除符合要求的项。比如你的测试文档中,"AaA"会被^aaa$i匹配移除,"BbB"会被^bbb$i匹配移除,"AAaa"因不完全匹配保留。
内容的提问来源于stack exchange,提问作者guai er
相关产品推荐
相关产品推荐

