开始
前几天项目需要,集合里面套集合操作,查了不少资料都是看都不看就抄别人的,自己也不验证一下,坑人!!!
操作都不难,但是要费点时间,为了下次不浪费时间,这里记录一下,再遇到可以直接用,好记性不如烂笔头!
数据示例:
{
"_id" : ObjectId("5fd09ec6ad5b083ads840"),
"typeId" : NumberLong(1),
"typeName" : "王者",
"description" : "王者",
"list" : [
{
"_id" : NumberLong(1),
"title" : "游戏内几级会获得升级大招的机会?",
"explain" : "A:4级,B:3级,C:5级",
"answer" : "A",
"select" : ""
},
{
"_id" : NumberLong(79340550),
"title" : "苹果甜不甜",
"explain" : "甜,不甜,嘎嘎甜",
"answer" : "嘎嘎甜",
"select" : "秦师傅"
},
{
"_id" : NumberLong(793406035),
"title" : "地球圆不圆",
"explain" : "圆,不圆,嘎嘎圆",
"answer" : "圆",
"select" : "秦师傅"
}
],
"_class" : "com.dq.api.dto.appletsdto.IdiomDto"
}
1、查询父集合
//条件
query.addCriteria(Criteria.where("_id").is(idiom.getId()));
.in(1,2,3)
.gte(1)
.lte(1)
.regex("^.*" + 1 + ".*$")//模糊
.skip()
.limit()
.with(Sort.by(Sort.Order.desc("a")));//排序
query.skip(0).limit(10);//分页
int count = Math.toIntExact(mongoTemplate.count(query, A.class, "a"));
List<A> a= mongoTemplate.find(query, A.class, "a");
2、更新父集合
Query query = Query.query(criteria);
Update update = new Update();
update.set("a", 1);
update.set("a", 1);
update.set("a", 1);
mongoTemplate.updateFirst(query, update, "a");//更一条(批量更,循环即可;或者用updateMulti())
3、删除/批删父集合(1,2,3)
if(ids != null && ids.length()>0){
String[] newIds = ids.split(",");
for(int i=0;i<newIds.length;i++){
String id = newIds[i];
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(id));
mongoTemplate.findAndRemove(query,A.class,"a");
}
}
4、新增父集合
mongoTemplate.save(idiom,"a");
5、查询子集合
子集:list2
条数:count
//聚合方式(子集条件查询分页)
List<Parent> list2 = new ArrayList<>();
//封装对象列表查询条件
List<AggregationOperation> commonOperations = new ArrayList<>();
if (null != id) {
//1. 指定查询主文档
MatchOperation match = Aggregation.match(where("_id").is(parentId));
commonOperations.add(match);
}
//2. 指定投影(list子集),返回哪些字段
ProjectionOperation project = project("list");
commonOperations.add(project);
//3. 拆分内嵌文档
UnwindOperation unwind = unwind("list");
commonOperations.add(unwind);
if (StringUtils.isNotBlank(childId)) {
//4. 指定查询子文档(条件精确)
MatchOperation match2 = Aggregation.match(
where("list._id").is(Long.parseLong(childId)));
commonOperations.add(match2);
}
if (StringUtils.isNotBlank(childName)) {
//4. 指定查询子文档(条件模糊)
MatchOperation match3 = Aggregation.match(
where("list.answer").regex("^.*" + childName+ ".*$"));
commonOperations.add(match3);
}
//count
Aggregation aggregation1 = Aggregation.newAggregation(commonOperations);
AggregationResults<JSONObject> reminds1 = mongoTemplate
.aggregate(aggregation1, "parent", JSONObject.class);
List<JSONObject> mappedResults1 = reminds1.getMappedResults();
int count = 0;
if(mappedResults1 != null){
count = mappedResults1.size();
}
//分页
SkipOperation skip = Aggregation.skip(0);
LimitOperation limit = Aggregation.limit(10);
commonOperations.add(skip);
commonOperations.add(limit);
//创建管道查询对象
Aggregation aggregation = Aggregation.newAggregation(commonOperations);
AggregationResults<JSONObject> reminds = mongoTemplate
.aggregate(aggregation, "parent", JSONObject.class);
List<JSONObject> mappedResults = reminds.getMappedResults();
//解析查询结果
if (mappedResults != null && mappedResults.size() > 0) {
for(int i=0;i<mappedResults.size();i++){
JSONObject jsonObject = mappedResults.get(i);
if(jsonObject != null){
JSONObject obj2 = jsonObject.getJSONObject("list");
Child child = JSONObject.parseObject(obj2.toJSONString(), Child.class);
list2.add(child);
}
}
}
5、更新子集合
Update update = Update.update("list.$.a", "a").set("list.$.b", "b").set("list.$.c", "c").set("list.$.d", "d");
Query query = new Query(where("_id").is(id).and("list.name").is("name"));
UpdateResult result = mongoTemplate.updateMulti(query, update, Parent.class, "parent");
6、删除/批删子集合
if(ids != null && ids.length()>0){
String[] newIds = ids.split(",");
for(int i=0;i<newIds.length;i++){
String id = newIds[i];
Long newId = Long.valueOf(id);
Update update = new Update();
update.pull("list",new BasicDBObject("_id",newId));
Query query = new Query(where("_id").is(parentId).and("list._id").is(newId));
UpdateResult result = mongoTemplate.updateMulti(query, update, Parent.class, "parent");
System.out.println(result.getModifiedCount());
}
}
7、添加子集合
Query query = new Query();
query.addCriteria(new Criteria("_id").is(parentId));
IdiomDto idiomDto = mongoTemplate.findOne(query, Parent.class, "parent");
List<Child> list = new ArrayList<>();
if(Parent!= null){
list = Parent.getList();
}
if(list == null){
list = new ArrayList<>();
}
//在原有的基础上添加
long id = System.currentTimeMillis();
child.setId(id);
list.add(child);
parent.setList(list);
mongoTemplate.save(parent, "parent");