文章目录
- 1. 插入一条数据 insert()
- 2. 插入一条数据 save()
- 3. 批量插入 insert()
- 4. 批量插入 insertAll()
- 5. 更新查询结果的第一个值 updateFirst()
- 6. 更新所有查询结果 updateMulti()
- 7. 数据库有就修改查询出的第一条,数据库没有就新增一条 upsert()
- 8. 删除符合条件的记录 remove()
- 9. 查询出符合条件的结果,并将符合条件的数据删除,只会删除第一条 findAndRemove()
- 10. 查询出符合条件的所有结果,并将符合条件的所有数据删除 findAllAndRemove()
- 11. 查询集合中所有数据,不加条件 findAll()
- 12. 封装query的常用的四种方法
- 13. 查询符合条件的第一条数据 findOne()
- 14. 查询符合条件的所有数据 find()
- 15. 查询符合条件的数量 count()
- 16. 同一个字段在条件中的正确写法&>,lt,gte,lte
- 17. andOperator 且相当于and
- 18. orOperator 或相当于or
- 19. andOperator和orOperator联合查询
- 20. in 在范围元素内
- 21. nin 不在范围元素内
- 22. 显示是否有该字段数据的值
- 23. 分页查询
- 24. 排序 sort 单个条件排序,多个条件排序
- 25. 分组查询 group()
- 27. 模糊匹配,完全匹配,左匹配,右匹配
- 28. 简单的聚合查询 aggregate()
- 29. 复杂的聚合查询
1. 插入一条数据 insert()
insert: 若新增数据的主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常提示主键重复,不保存当前数据。
insert: 可以一次性插入一整个列表,而不用进行遍历操作,效率相对较高
/**
* 插入一条数据,若新增数据的主键已经存在,则会抛异常,不会插入数据
* <T> T insert(T objectToSave)
*/
@Test
public void test01() {
User user1 = new User("1","关羽","男",30,"蜀国","2020-08-26","190","55");
User insert = mongoTemplate.insert(user1);
}
2. 插入一条数据 save()
/**
* 插入一条数据,若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作
* <T> T save(T objectToSave)
*/
@Test
public void test02(){
User user1 = new User("1","关羽","男",33,"蜀国","2020-08-26","190","55");
User save = mongoTemplate.save(user1);
}
3. 批量插入 insert()
/**
* 批量插入insert()
* <T> Collection<T> insert(Collection<? extends T> batchToSave, Class<?> entityClass
* batchToSave : 添加对象的集合
* entityClass: 对象的实体类.class
*/
@Test
public void test3(){
User user2 = new User("2","关凤","女",31,"蜀国","2020-07-26","198","56");
User user3 = new User("3","关平","男",30,"蜀国","2020-07-26","180","57");
User user4 = new User("4","张飞","男",19,"蜀国","2020-08-26","177","58");
User user5 = new User("5","孙权","男",35,"魏国","2020-08-26","177","58");
User user6 = new User("6","孙玲珑","女",30,"魏国","2020-07-26","189","57");
List<User> list = new ArrayList<>();
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
list.add(user6);
mongoTemplate.insert(list,User.class);
}
4. 批量插入 insertAll()
/**
* 批量插入 insertAll()
* <T> Collection<T> insertAll(Collection<? extends T> objectsToSave)
* objectsToSave : 插入的对象集合
*/
@Test
public void test4(){
User user7 = new User("7","孙尚香","女",39,"魏国","2020-07-26","178","45");
User user8 = new User("8","黄盖","男",30,"魏国","2020-08-26","187","45");
User user9 = new User("9","曹操","男",34,"吴国国","2020-08-26","199","60");
User user10 = new User("10","貂蝉","女",30,"吴国国","2020-06-26","190","66");
User user11 = new User("11","马云禄","女",40,"吴国国","2020-06-26","188","67");
User user12 = new User("12","曹彰","男",30,"吴国国","2020-08-26","190","68");
List<User> list = new ArrayList<>();
list.add(user7);
list.add(user8);
list.add(user9);
list.add(user10);
list.add(user11);
list.add(user12);
mongoTemplate.insertAll(list);
}
5. 更新查询结果的第一个值 updateFirst()
/**
* 更新查询结果的第一个值
* mongoTemplate.update() 不建议用
* 方法1更新最慢,方法2和方法3差不多
* 方法1 : UpdateResult updateFirst(Query query, Update update, Class<?> entityClass)
* 方法2 : UpdateResult updateFirst(Query query, Update update, String collectionName)
* 方法3 : UpdateResult updateFirst(Query query, Update update, Class<?> entityClass, String collectionName)
* query : 更新条件
* update : 更新值
* entityClass : 集合对应的实体类.class
* collectionName : 集合名称
*/
@Test
public void test6(){
Query query = new Query();
query.addCriteria(Criteria.where("address").is("吴国"));
Update update = new Update();
update.set("address","吴国国");
update.set("weight","61");
long start = System.currentTimeMillis();
mongoTemplate.updateFirst(query,update,User.class);
long end = System.currentTimeMillis();
System.out.println("==========================================");
System.out.println("方法1耗时: " + (end - start)); //执行最慢
/* long start1 = System.currentTimeMillis();
mongoTemplate.updateFirst(query,update,"user");
long end1 = System.currentTimeMillis();
System.out.println("==========================================");
System.out.println("方法2耗时: " + (end1 - start1)); //*/
/* long start2 = System.currentTimeMillis();
mongoTemplate.updateFirst(query,update,User.class,"user");
long end2 = System.currentTimeMillis();
System.out.println("==========================================");
System.out.println("方法3耗时: " + (end2 - start2)); //方法2,方法3,差不多*/
}
6. 更新所有查询结果 updateMulti()
/**
* 更新所有查询结果
* 方法1更新最慢,方法2和方法3差不多
* 方法1 : UpdateResult updateMulti(Query query, Update update, Class<?> entityClass)
* 方法2 : UpdateResult updateMulti(Query query, Update update, String collectionName)
* 方法3 : UpdateResult updateMulti(Query query, Update update, Class<?> entityClass, String collectionName)
* query : 更新条件
* update : 更新值
* entityClass : 集合对应的实体类.class
* collectionName : 集合名称
*/
@Test
public void test07(){
Query query = new Query();
query.addCriteria(Criteria.where("address").is("吴国"));
Update update = new Update();
update.set("address","吴国国");
update.set("weight","61");
long start = System.currentTimeMillis();
mongoTemplate.updateMulti(query,update,User.class);
long end = System.currentTimeMillis();
System.out.println("==========================================");
System.out.println("方法1耗时: " + (end - start)); //40 执行最慢
/
Query query1 = new Query();
query1.addCriteria(Criteria.where("address").is("吴国国"));
Update update1 = new Update();
update1.set("address","吴国");
update1.set("weight","61");
long start1 = System.currentTimeMillis();
mongoTemplate.updateMulti(query1,update1,"user");
long end1 = System.currentTimeMillis();
System.out.println("==========================================");
System.out.println("方法2耗时: " + (end1 - start1)); //35
Query query2 = new Query();
query2.addCriteria(Criteria.where("address").is("吴国"));
Update update2 = new Update();
update2.set("address","吴国国");
update2.set("weight","61");
long start2 = System.currentTimeMillis();
mongoTemplate.updateMulti(query2,update2,User.class,"user");
long end2 = System.currentTimeMillis();
System.out.println("==========================================");
System.out.println("方法3耗时: " + (end2 - start2)); //方法2,方法3,差不多
}
7. 数据库有就修改查询出的第一条,数据库没有就新增一条 upsert()
/**
* 数据库有就修改查询出的第一条,数据库没有就新增一条
* 方法1更新最慢,方法2和方法3差不多
* 方法1 : UpdateResult upsert(Query query, Update update, Class<?> entityClass)
* 方法2 : UpdateResult upsert(Query query, Update update, String collectionName)
* 方法3 : UpdateResult upsert(Query query, Update update, Class<?> entityClass, String collectionName)
* query : 更新条件
* update : 更新值
* entityClass : 集合对应的实体类.class
* collectionName : 集合名称
*/
@Test
public void test08(){
Query query = new Query();
query.addCriteria(Criteria.where("address").is("魏国国"));
Update update = new Update();
update.set("address","魏国");
update.set("weight","61");
mongoTemplate.upsert(query,update,User.class);
// mongoTemplate.upsert(query,update,"user");
// mongoTemplate.upsert(query,update,User.class,"user");
}
8. 删除符合条件的记录 remove()
/**
* 删除符合条件的记录
* 方法1 : DeleteResult remove(Query query, Update update, Class<?> entityClass)
* 方法2 : DeleteResult remove(Query query, Update update, String collectionName)
* 方法3 : DeleteResult remove(Query query, Update update, Class<?> entityClass, String collectionName)
* query : 删除条件
* entityClass : 集合对应的实体类.class
* collectionName : 集合名称
*/
@Test
public void test09(){
Query query = new Query();
query.addCriteria(Criteria.where("address").is("魏国国"));
mongoTemplate.remove(query,User.class);
mongoTemplate.remove(query,"user");
mongoTemplate.remove(query,User.class,"user");
}
9. 查询出符合条件的结果,并将符合条件的数据删除,只会删除第一条 findAndRemove()
/**
* 查询出符合条件的结果,并将符合条件的数据删除,只会删除第一条
* 方法1 : DeleteResult findAndRemove(Query query, Update update, Class<?> entityClass)
* 方法2 : DeleteResult findAndRemove(Query query, Update update, Class<?> entityClass, String collectionName)
* query : 删除条件
* entityClass : 集合对应的实体类.class
* collectionName : 集合名称
*/
@Test
public void test10(){
Query query = new Query();
query.addCriteria(Criteria.where("address").is("魏国国"));
mongoTemplate.findAndRemove(query,User.class);
mongoTemplate.findAndRemove(query,User.class,"user");
}
10. 查询出符合条件的所有结果,并将符合条件的所有数据删除 findAllAndRemove()
/**
* 查询出符合条件的所有结果,并将符合条件的所有数据删除
* 方法1 : DeleteResult findAllAndRemove(Query query, Update update, Class<?> entityClass)
* 方法2 : DeleteResult findAllAndRemove(Query query, Update update, String collectionName)
* 方法3 : DeleteResult findAllAndRemove(Query query, Update update, Class<?> entityClass, String collectionName)
* query : 删除条件
* entityClass : 集合对应的实体类.class
* collectionName : 集合名称
*/
@Test
public void test11(){
Query query = new Query();
query.addCriteria(Criteria.where("address").is("魏国国"));
mongoTemplate.findAllAndRemove(query,User.class);
mongoTemplate.findAllAndRemove(query,"user");
mongoTemplate.findAllAndRemove(query,User.class,"user");
}
11. 查询集合中所有数据,不加条件 findAll()
/**
* 查询集合中所有数据,不加条件
* 方法2要快于方法1
* 方法1 : <T> List<T> findAll(Class<T> entityClass)
* 方法2 : <T> List<T> findAll(Class<T> entityClass, String collectionName) (推荐)
* entityClass : 集合对应的实体类.class
* collectionName : 集合名称
*/
@Test
public void test12(){
long start1 = System.currentTimeMillis();
List<User> list1 = mongoTemplate.findAll(User.class);
long end1 = System.currentTimeMillis();
System.out.println("方法1查询结果总数 : " + list1.size());
System.out.println("方法1耗时: " + (end1 - start1)); //
System.out.println("==========================================");
long start2 = System.currentTimeMillis();
List<User> list2 = mongoTemplate.findAll(User.class, "user");
long end2 = System.currentTimeMillis();
System.out.println("方法2查询结果总数 : " + list2.size());
System.out.println("方法2耗时: " + (end2 - start2)); //
}
12. 封装query的常用的四种方法
/**
* 封装query的常用的四种方法
*/
@Test
public void test13(){
//方法1
// Query query = new Query();
// Criteria criteria = new Criteria();
// criteria.andOperator(Criteria.where("address").is("中国"),
// Criteria.where("weight").is("61"));
// query.addCriteria(criteria);
//方法2
// Query query = new Query(new Criteria().andOperator(Criteria.where("address").is("中国"),
// Criteria.where("weight").is("61")));
//方法3
// Query query = new Query();
// query.addCriteria(Criteria.where("address").is("中国"));
// query.addCriteria(Criteria.where("weight").is("61"));
//方法4 (多用于判断多个参数拼接条件)
// List<Criteria> list=new ArrayList<Criteria>();
// Criteria criteria = new Criteria();
// if (1 == 1){ //判断条件
// criteria = Criteria.where("address").is("中国");
// list.add(criteria);
// }
// if (1 == 1){ //判断条件
// criteria = Criteria.where("weight").is("61");
// list.add(criteria);
// }
//
// Criteria[] arr = new Criteria[list.size()];
// list.toArray(arr);
// Criteria criterias = new Criteria().andOperator(arr);
// Query query = new Query(criterias);
}
13. 查询符合条件的第一条数据 findOne()
/**
* 查询符合条件的第一条数据
* 方法2要快于方法1
* 方法1 : <T> T findOne(Query query, Class<T> entityClass)
* 方法2 : <T> T findOne(Query query, Class<T> entityClass, String collectionName) (推荐)
* entityClass : 集合对应的实体类.class
* collectionName : 集合名称
*/
@Test
public void test14(){
Query query = new Query();
Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("address").is("中国"),
Criteria.where("weight").is("61"));
query.addCriteria(criteria);
long start1 = System.currentTimeMillis();
User user1 = mongoTemplate.findOne(query, User.class);
long end1 = System.currentTimeMillis();
System.out.println("方法1查询结果 : " + user1.getAddress());
System.out.println("方法1耗时: " + (end1 - start1)); //
System.out.println("==========================================");
long start2 = System.currentTimeMillis();
User user2 = mongoTemplate.findOne(query, User.class, "user");
long end2 = System.currentTimeMillis();
System.out.println("方法2查询结果 : " + user2.getAddress());
System.out.println("方法2耗时: " + (end2 - start2)); //
}
14. 查询符合条件的所有数据 find()
/**
* 查询符合条件的所有数据
* 方法2要快于方法1
* 方法1 : <T> List<T> find(Query query, Class<T> entityClass)
* 方法2 : <T> List<T> find(Query query, Class<T> entityClass, String collectionName) (推荐)
* entityClass : 集合对应的实体类.class
* collectionName : 集合名称
*/
@Test
public void test15(){
Query query = new Query();
Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("address").is("魏国"),
Criteria.where("sex").is("女"));
query.addCriteria(criteria);
long start1 = System.currentTimeMillis();
List<User> list1 = mongoTemplate.find(query, User.class);
long end1 = System.currentTimeMillis();
System.out.println("方法1查询结果总数 : " + list1.size());
System.out.println("方法1耗时: " + (end1 - start1)); //
System.out.println("==========================================");
long start2 = System.currentTimeMillis();
List<User> list2 = mongoTemplate.find(query, User.class, "user");
long end2 = System.currentTimeMillis();
System.out.println("方法2查询结果总数 : " + list2.size());
System.out.println("方法2耗时: " + (end2 - start2)); //
}
15. 查询符合条件的数量 count()
/**
* 查询符合条件的数量
* 方法2,3 快于 方法1
* 方法1 : long count(Query query, Class<?> entityClass)
* 方法2 : long count(Query query, String collectionName)
* 方法3 : long count(Query query, @Nullable Class<?> entityClass, String collectionName)
*/
@Test
public void test16(){
Query query = new Query();
Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("address").is("魏国"),
Criteria.where("sex").is("女"));
query.addCriteria(criteria);
long start1 = System.currentTimeMillis();
long count1 = mongoTemplate.count(query, User.class);
long end1 = System.currentTimeMillis();
System.out.println("方法1查询结果总数 : " + count1);
System.out.println("方法1耗时: " + (end1 - start1));
System.out.println("==========================================");
long start2 = System.currentTimeMillis();
long count2 = mongoTemplate.count(query, "user");
long end2 = System.currentTimeMillis();
System.out.println("方法2查询结果总数 : " + count2);
System.out.println("方法2耗时: " + (end2 - start2));
System.out.println("==========================================");
long start3 = System.currentTimeMillis();
long count3 = mongoTemplate.count(query, User.class,"user");
long end3 = System.currentTimeMillis();
System.out.println("方法3查询结果总数 : " + count3);
System.out.println("方法3耗时: " + (end3 - start3));
System.out.println("==========================================");
}
16. 同一个字段在条件中的正确写法&>,lt,gte,lte
/**
* 同一个字段在条件中的正确写法&>,lt,gte,lte,
*/
@Test
public void test17() {
//这种写法是错误的 (同一个字段(insertDt)在一个查询中不能用这种方式)
// Query query = new Query();
// query.addCriteria(Criteria.where("insertDt").gte("2020-07-01"));
// query.addCriteria(Criteria.where("insertDt").lte("2020-07-31"));
//这种写法是错误的(同一个查询不能同时出现多次andOperator或者orOperator)
// Criteria criteria = new Criteria().andOperator(Criteria.where("insertDt").gte("2020-07-01")).andOperator(Criteria.where("insertDt").lte("2020-07-31"));
// Query query = new Query(criteria);
//正确的写法
Criteria criteria = new Criteria().andOperator(Criteria.where("insertDt").gte("2020-07-01"),
Criteria.where("insertDt").lte("2020-07-31"));
Query query = new Query(criteria);
List<User> list = mongoTemplate.find(query, User.class, "user");
for (User user : list) {
System.out.println(user.getName());
}
}
17. andOperator 且相当于and
/**
* andOperator 且相当于and
*/
@Test
public void test18() {
Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("魏国"),
Criteria.where("sex").is("女"));
Query query = new Query(criteria);
List<User> list = mongoTemplate.find(query, User.class, "user");
for (User user : list) {
System.out.println(user.getName());
}
}
18. orOperator 或相当于or
/**
* orOperator 或相当于or
*/
@Test
public void test19() {
Criteria criteria = new Criteria().orOperator(Criteria.where("address").is("魏国"),
Criteria.where("height").is("177"));
// Criteria criteria = new Criteria().orOperator(Criteria.where("address").is("魏国"),
// Criteria.where("address").is("吴国国"));
Query query = new Query(criteria);
List<User> list = mongoTemplate.find(query, User.class, "user");
for (User user : list) {
System.out.println(user.getName());
}
}
19. andOperator和orOperator联合查询
/**
* andOperator和orOperator联合查询
*/
@Test
public void test20() {
//andOperator,orOperator-->orOperator
Criteria criteria1 = new Criteria().andOperator(Criteria.where("sex").is("女"),
Criteria.where("age").lt(35));
Criteria criteria2 = new Criteria().orOperator(Criteria.where("address").is("魏国"), Criteria.where("weight").is("61"));
Criteria criteria = new Criteria();
criteria.orOperator(criteria1, criteria2);
Query query = new Query(criteria);
//andOperator,andOperator-->orOperator
/* Criteria criteria1 = new Criteria().andOperator(Criteria.where("sex").is("女"),
Criteria.where("age").lt(35));
Criteria criteria2 = new Criteria().andOperator(Criteria.where("address").is("魏国"));
Criteria criteria = new Criteria();
criteria.orOperator(criteria1,criteria2);
Query query = new Query(criteria);*/
List<User> list = mongoTemplate.find(query, User.class, "user");
for (User user : list) {
System.out.println(user.getName());
}
}
20. in 在范围元素内
/**
* in 在范围元素内
*/
@Test
public void test21() {
List<String> names = new ArrayList<>();
Collections.addAll(names, "关羽", "关凤", "关平");
Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("蜀国"),
Criteria.where("name").in(names));
Query query = new Query(criteria);
List<User> list = mongoTemplate.find(query, User.class, "user");
for (User user : list) {
System.out.println(user.getName());
}
}
21. nin 不在范围元素内
/**
* nin 不在范围元素内
*/
@Test
public void test22() {
List<String> names = new ArrayList<>();
Collections.addAll(names, "关羽", "关凤", "关平");
Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("蜀国"),
Criteria.where("name").nin(names));
Query query = new Query(criteria);
List<User> list = mongoTemplate.find(query, User.class, "user");
for (User user : list) {
System.out.println(user.getName());
}
}
22. 显示是否有该字段数据的值
/**
* 显示是否有该字段数据的值
* exists(boolean b) true:是 false:否
*/
@Test
public void test23() {
Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("中国"),
Criteria.where("age").exists(false));
Query query = new Query(criteria);
// Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("蜀国"),
// Criteria.where("age").exists(true));
// Query query = new Query(criteria);
List<User> list = mongoTemplate.find(query, User.class, "user");
for (User user : list) {
System.out.println(user.getName() + "====" + user.getAddress());
}
}
23. 分页查询
/**
* 分页查询
*/
@Test
public void test24() {
int currentPage = 1; //当前页
int pageSize = 5; //每页显示记录数
Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("蜀国"));
Query query = new Query(criteria);
query.skip((currentPage - 1) * pageSize);
query.limit(pageSize);
//简化代码
// query.skip((currentPage - 1) * pageSize).limit(pageSize);
//另一种方式
// Pageable pageable = new PageRequest((currentPage - 1) * pageSize, pageSize);
// query.with(pageable);
List<User> list = mongoTemplate.find(query, User.class, "user");
//查询总记录数
int total = (int) mongoTemplate.count(query, User.class, "user");
int totalCount = Integer.parseInt(String.valueOf(total));
//总页数
int totalPage = 0;
if (totalCount <= pageSize) {
totalPage = 1;
} else {
totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
}
System.out.println("总记录数: " + totalCount);
System.out.println("总页数: " + totalPage);
for (User user : list) {
System.out.println(user.getId() + "=============" + user.getName());
}
}
24. 排序 sort 单个条件排序,多个条件排序
/**
* 排序 sort 单个条件排序,多个条件排序
*/
@Test
public void test25() {
int currentPage = 1; //当前页
int pageSize = 5; //每页显示记录数
Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("魏国"));
Query query = new Query(criteria);
//方式1 单个条件的排序
Sort sort = new Sort(Sort.Direction.DESC, "insertDt");
//方式2 单个条件的排序
// Sort sort = Sort.by(Sort.Order.desc("insertDt"));
//多个条件排序
// Sort sort = Sort.by(Sort.Order.desc("insertDt"),
// Sort.Order.asc("age"));
query.with(sort);
query.skip((currentPage - 1) * pageSize).limit(pageSize);
List<User> list = mongoTemplate.find(query, User.class, "user");
//查询总记录数
long total = mongoTemplate.count(query, User.class, "user");
int totalCount = Integer.parseInt(String.valueOf(total));
//总页数
int totalPage = 0;
if (totalCount <= pageSize) {
totalPage = 1;
} else {
totalPage = (totalCount % pageSize) == 0 ? (totalCount / pageSize) : (totalCount / pageSize + 1);
}
System.out.println("总记录数: " + totalCount);
System.out.println("总页数: " + totalPage);
for (User user : list) {
System.out.println(user.getId() + "===" + user.getName() + "===" + user.getInsertDt() + "===" + user.getAge());
}
}
25. 分组查询 group()
/**
* 分组查询
* <T> GroupByResults<T> group(@Nullable Criteria criteria, String inputCollectionName, GroupBy groupBy, Class<T> entityClass)
* criteria : 查询条件
* inputCollectionName : 集合名称
* groupBy : 分组条件
* entityClass : 集合对应的实体类.class
*/
@Test
public void test26() {
// Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("魏国"));
Criteria criteria = new Criteria();
String reduce = "function reduce(doc,out){" +
"var height = parseFloat(doc.height);" +
"var weight = parseFloat(doc.weight);" +
"out.sumHeight += height;" +
"out.sumWeight += weight; " +
"out.address = doc.address" +
"}";
GroupBy groupBy = new GroupBy("address")
.initialDocument("{address:'',sumHeight:0,sumWeight:0}")
.reduceFunction(reduce);
GroupByResults<User> result = mongoTemplate.group(criteria, "user", groupBy, User.class);
List list = (List) result.getRawResults().get("retval");
list.forEach(item->{
Document doc = (Document) item;
String address = doc.getString("address");
Double height = doc.getDouble("sumHeight");
Double weight = doc.getDouble("sumWeight");
System.out.println(address + "==" + height + "==" + weight);
});
}
27. 模糊匹配,完全匹配,左匹配,右匹配
/**
* 模糊匹配,完全匹配,左匹配,右匹配
*/
@Test
public void test29(){
String str = "孙珑";
//完全匹配
// Pattern pattern = Pattern.compile("^" + str + "$", Pattern.CASE_INSENSITIVE);
//右匹配
// Pattern pattern = Pattern.compile("^.*" + str + "$", Pattern.CASE_INSENSITIVE);
//左匹配
// Pattern pattern = Pattern.compile("^" + str + ".*$", Pattern.CASE_INSENSITIVE);
//模糊匹配
Pattern pattern = Pattern.compile("^.*" + str + ".*$", Pattern.CASE_INSENSITIVE);
Criteria criteria = new Criteria().andOperator(/*Criteria.where("address").is("魏国"),*/
Criteria.where("name").regex(pattern));
Query query = new Query(criteria);
List<User> list = mongoTemplate.find(query, User.class, "user");
for (User user : list) {
System.out.println(user.getName() + "==" + user.getAddress());
}
}
28. 简单的聚合查询 aggregate()
/**
* 简单的聚合查询
* <O> AggregationResults<O> aggregate(Aggregation aggregation, String collectionName, Class<O> outputType)
* aggregation : 条件
* collectionName : 集合名字
* outputType : 查询的结果类型(xxx.class)
*/
@Test
public void test27(){
Criteria criteria1 = new Criteria().andOperator(Criteria.where("insertDt").gte("2020-07-01"),
Criteria.where("insertDt").lte("2020-07-31"));
Criteria criteria2 = Criteria.where("sex").is("女");
Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria1),
Aggregation.match(criteria2));
AggregationResults<User> result = mongoTemplate.aggregate(aggregation, "user", User.class);
List<User> list = result.getMappedResults();
list.forEach(item->{
System.out.println(item.getName());
});
}
29. 复杂的聚合查询
/**
* 复杂的聚合查询
* <O> AggregationResults<O> aggregate(Aggregation aggregation, String collectionName, Class<O> outputType)
* aggregation : 条件
* collectionName : 集合名字
* outputType : 查询的结果类型(xxx.class)
*/
@Test
public void test28(){
int pageNum = 1;
int pageSize = 3;
Criteria criteria1 = new Criteria().andOperator(Criteria.where("insertDt").gte("2020-07-01"),
Criteria.where("insertDt").lte("2020-07-31"));
/**
* project : 列出所有本次查询的字段,包括查询条件的字段和需要搜索的字段
* match : 搜索条件criteria
* group : 分组的字段,以及聚合相关查询
* sum : 求和
* count : 数量
* max ; 最大值
* min : 最小值
* avg : 平均值
* sort ; 排序
* skip&limit:分页查询
*/
Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria1),
// Aggregation.project("address","insertDt","age","name"),
Aggregation.sort(new Sort(Sort.Direction.DESC, "insertDt")),
Aggregation.skip(pageNum),
Aggregation.limit(pageSize),
Aggregation.group("address").sum("age").as("sum").count().as("count").max("age").as("max")
.min("age").as("min").avg("age").as("avg").first("name").as("name"));
AggregationResults<ResultModel> user = mongoTemplate.aggregate(aggregation, "user", ResultModel.class);
List<ResultModel> results = user.getMappedResults();
for (ResultModel result : results) {
System.out.println(result.getName() + "==" + result.getAddress() + "==" + result.getSum() + "==" +result.getCount()+"=="+
result.getMax()+"==" + result.getMin());
}
}