1.插入
1.1.mongoTemplate.save():_id存在时更新数据,不会抛出异常,不支持批量插入。
1.2.mongoTemplate.insert():_id存在时抛出异常,支持批量插入。
List<Employee> list = Arrays.asList(
new Employee(3,"小红",20,200.50,new Date()),
new Employee(4,"小李",18,250.50,new Date()),
new Employee(5,"小杨",17,300.00,new Date()),
new Employee(6,"小王",15,100.00,new Date())
);
//Employee employee = new Employee(2,"小张",25,500.00,new Date());
Collection<Employee> insert = mongoTemplate.insert(list, Employee.class);
2.查询文档![](https://img-blog.csdnimg.cn/9c4699ca1b784af5a52d39976fe9e760.png)
2.1.范围查询gte、lte
//查询薪资大于8000的员工
Query query = new Query(Criteria.where("salary").gte(8000));
List<Employee> employees = mongoTemplate.find(query, Employee.class);
//查询薪资大于8000小于10000的员工
Query query = new Query(Criteria.where("salary").gte(8000).lte(10000));
List<Employee> employees = mongoTemplate.find(query, Employee.class);
2.2.模糊查询
//模糊查询->查询姓名包含“张”的员工,有其他的需求直接写正则表达式即可
Query query = new Query(Criteria.where("name").regex("张"));
List<Employee> employees = mongoTemplate.find(query, Employee.class);
2.3.多条件查询and、or
//and or
Criteria criteria = new Criteria();
//查询年龄大于20岁且工资低于8000的员工
criteria.andOperator(Criteria.where("name").lt(20),
Criteria.where("salasy").lt(8000));
Query query = new Query(criteria);
List<Employee> employees = mongoTemplate.find(query, Employee.class);
2.4.排序查询 sort
//and or
Criteria criteria = new Criteria();
//查询年龄大于20岁且工资低于8000的员工
criteria.andOperator(Criteria.where("name").lt(20),
Criteria.where("salary").lt(8000));
Query query = new Query(criteria);
//sort 排序(对薪资进行降序)
query.with(Sort.by(Sort.Order.desc("salary")));
List<Employee> employees = mongoTemplate.find(query, Employee.class);
2.5.分页查询
//and or
Criteria criteria = new Criteria();
//查询年龄大于20岁且工资低于8000的员工
criteria.andOperator(Criteria.where("name").lt(20),
Criteria.where("salary").lt(8000));
Query query = new Query(criteria);
//sort 排序(对薪资进行降序)
query.with(Sort.by(Sort.Order.desc("salary")));
//分页查询
query.skip(0);//从第0条开始
query.limit(4);//每页返回4条数据
List<Employee> employees = mongoTemplate.find(query, Employee.class);
2.6.json字符串查询
2.6.1等值查询
String json = "{name:'张三'}";
Query jsonQuery = new BasicQuery(json);
List<Employee> empList = mongoTemplate.find(query, Employee.class);
3.更新文档(先查询后执行)
3.1.upadateFirst():只更新满足条件的第一条记录
3.2.updateMulti():更新满足条件的所有记录
3.3.upSert():没有符合条件的记录则插入
Query query = new Query(Criteria.where("cid").is(id).and("is_deleted").is(false));
Update update = new Update();
update.set("is_deleted",true);
mongoTemplate.updateMulti(query,update, Resource.class);
4.删除文档
//删除工资高于8000的员工
Query removeQuery = new Query(Criteria.where("salary").gt(8000));
DeleteResult remove = mongoTemplate.remove(new Query(), Employee.class);
5.集合操作![](https://img-blog.csdnimg.cn/78fb28fae7e7485dad5117ac6e0f3ad2.png)
5.1.单一聚合操作
db.emp.count() :统计:不忽略过滤条件
db.emp.estimatedDocumentCount():统计:忽略过滤条件
db.emp.distinct():去重
5.2.集合管道
![](https://img-blog.csdnimg.cn/6286df8b185a42a596b0e93801f8d0ed.png)
5.2.1.$project:
(1):投影操作(取别名),将原始字段名投影成指定名称,如将集合中的name投影成noname -> db.emp.aggregate([$project:{noname:"$name"}])
没投影前:
投影后:
(2)$project可以灵活的控制输出的格式,也可以剔除不需要的字段->db.emp.aggregate([$project:{noname:"$name",_id:0,age:1}]):0不展示,1展示
(3)从嵌套文档中排除字段(type字段是一个集合,age为集合里面的一个字段) ->
db.emp.aggregate([$project:{noname:"$name",_id:0,"type.age":1}])
或者
db.emp.aggregate([$project:{noname:"$name",_id:0,type:{age:1}}])
5.2.2.$match(涉及到效率,看看下面的文字说明)![](https://img-blog.csdnimg.cn/eb3c64cbf8cd4ee2a821ff91299a04d2.png)
实际上就是精准匹配->查询age等于30的->
查询age等于30,name包含小的
5.2.3.$count
age_count:返回的结果名称
5.2.4.$group
5.3.案例:
book的数量,收藏总数和平均值
![](https://img-blog.csdnimg.cn/8f3857e5c95e4cd689f3368f13ca4455.png)
统计每个作者的book收藏总数
统计每个作者的每本book的收藏数 每个作者的book的type合集