sprinngboot+Mongodb
官网: https://www.mongodb.com/docs/mongodb-shell/crud/insert/
来源: https://blog.csdn.net/m0_46742141/article/details/121845098 (亲测可用)
maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,
MongoRespository操作简单
MongoTemplate操作灵活
配置文件
application.yml
spring
data
mongodb
uri: mongodb://47.103.24.101:27017/test
实体类
@Data
@Document("User")//实体和mongo中集合collect对应
public class User {
@Id -----加这个获取默认自增的id
private String id;
private String name;
private Integer age;
private String email;
private String createDate;
}
实现类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
//注入MongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
//添加数据
@Test
public void create(){
User user=new User();
user.setAge(20);
user.setName("zhangsan");
user.setEmail("123@qq.com");
User user1 = mongoTemplate.insert(user);
System.out.println(user1);
}
//查询全部数据
@Test
public void findAll(){
List<User> list = mongoTemplate.findAll(User.class);
System.out.println(list);
}
//根据id查询
@Test
public void findById(){
User user = mongoTemplate.findById("61b4776540a252406bba6b18", User.class);
System.out.println("查询数据"+user);
}
//条件查询
@Test
public void findUserList(){
Query query=new Query(Criteria.where("name").is("zhangsan").and("age").is(20));
List<User> users = mongoTemplate.find(query, User.class);
System.out.println(users);
}
//模糊查询
@Test
public void findLikeUserList(){
String name="san";
String regex=String.format("%s%s%s",".*",name,".*$");
Pattern pattern=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);//Pattern.CASE_INSENSITIVE :设置常量
Query query=new Query(Criteria.where("name").regex(pattern));
List<User> list=mongoTemplate.find(query,User.class);
System.out.println(list);
}
//条件查询带分页
@Test
public void findUserPageList(){
int pageNo=1;
int pageSize=3;
//条件构建
String name="san";
String regex=String.format("%s%s%s",".*",name,".*$");
Pattern pattern=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);//Pattern.CASE_INSENSITIVE :设置常量
Query query=new Query(Criteria.where("name").regex(pattern));
//分页构建
//查询记录数
long count = mongoTemplate.count(query, User.class);
//分页
List<User> list = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
System.out.println(list);
}
//修改
@Test
public void updateUser(){
User user = mongoTemplate.findById("61b4776540a252406bba6b18", User.class);
//设置修改值
user.setName("test");
user.setAge(100);
user.setEmail("8888@qq.com");
//调用实现方法
Query query=new Query(Criteria.where("_id").is(user.getId()));
Update update=new Update(); ---这个是mogo第三方库的对象
update.set("name",user.getName());
update.set("age",user.getAge());
update.set("email",user.getEmail());
UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
long modifiedCount = upsert.getModifiedCount();
System.out.println(modifiedCount);
}
可以修改一条或者全部的见: https://www.cnblogs.com/xuxiaojian/p/14408856.html#2%E6%9B%B4%E6%96%B0%E6%95%B0%E6%8D%AE
Criteria criteria = Criteria.where("title").is(title);
Query query = new Query(criteria);
// Query query = new Query();
// query.addCriteria(Criteria.where("title").is(title));
Update update = new Update().set("topRank",top);
//更新满足条件的第一条数据
mongoTemplate.updateFirst(query,update,GuShiCi.class);
//更新满足条件的所有数据
mongoTemplate.updateMulti(query,update,GuShiCi.class);
//删除
@Test
public void deleteUser(){
Query query =new Query(Criteria.where("_id").is("61b49556f54e8f08aa7fcf93"));
DeleteResult remove = mongoTemplate.remove(query, User.class);
long count = remove.getDeletedCount();
System.out.println(count);
}
//统计数量
Query query = new Query(Criteria.where("gradeTypeId").is(gradeTypeId));
return mongoTemplate.count(query,BiBeiMingJu.class);
基于MongoRepository开发CRUD
创建interface的接口,继承MongoRepository类
public interface UserRepository extends MongoRepository<User,String> {
}
实现类
//注入MongoTemplate
@Autowired
private UserRepository userRepository;
//添加方法
@Test
public void create(){
User user =new User();
user.setAge(50);
user.setName("lucsse");
user.setEmail("3333@qq.com");
User save = userRepository.save(user);
System.out.println(save);
}
//查询全部数据
@Test
public void findAll(){
List<User> list = userRepository.findAll();
System.out.println(list);
}
//根据id查询
@Test
public void findById(){
User user = userRepository.findById("61b49ff67d773a2e9587aeff").get();
System.out.println(user);
}
//条件查询
@Test
public void findUserList(){
User user =new User();
user.setAge(30);
user.setName("lucy");
Example<User> example=Example.of(user) ;
List<User> all = userRepository.findAll(example);
System.out.println(all);
}
//模糊查询
@Test
public void findLikeUserList(){
//设置模糊查询匹配规则
ExampleMatcher matcher=ExampleMatcher.matching()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)//ExampleMatcher.StringMatcher.CONTAINING :表示设置模糊查询
.withIgnoreCase(true);
User user =new User();
user.setName("c");
Example<User> example=Example.of(user,matcher) ;
List<User> all = userRepository.findAll(example);
System.out.println(all);
}
//条件查询带分页
@Test
public void findUserPageList(){
//设置分页参数
Pageable pageable = PageRequest.of(0, 3);
User user =new User();
user.setName("lucy");
Example<User> example=Example.of(user) ;
Page<User> page = userRepository.findAll(example, pageable);
page.getTotalPages();
System.out.println(page);
}
//修改
@Test
public void updateUser(){
User user = userRepository.findById("61b4a30c3db5d039fda97e60").get();
user.setName("ssssss");
user.setAge(100);
user.setEmail("55555@qq.com");
//save(),方法有id则修改,无id则添加
User save = userRepository.save(user);
System.out.println(save);
}
//删除
@Test
public void deleteUser(){
userRepository.deleteById("61b4a30c3db5d039fda97e60");
}
注意:要用比较运算的话要先指定数字类型
Long aa=1662226682000L;
Query query=new Query(Criteria.where("createdtime").gte(aa).lte(aa));
List<BugMeassge> users = mongoTemplate.find(query, BugMeassge.class);
System.out.println(users);
gte 大于等于 lte小于等于
gt 大于 lt小于
is 等于
mongo配置参考:
https://blog.csdn.net/qq_36324685/article/details/82621156
在控制台输出nosql的日志
在application.yml中添加
logging:
level:
org:
springframework:
data:
mongodb:
core: DEBUG
分组聚合函数
https://www.jb51.net/article/236826.htm
去重排序见 https://blog.csdn.net/web18224617243/article/details/126114329
聚合函数参考: https://blog.csdn.net/web18224617243/article/details/126114329
例子:
//从mongodb里获取满足条件的记录 status:状态 1:上架 2:下架
Criteria criteria = Criteria.where("status").is("new");
//聚合函数查询统计信息
Aggregation aggregation = Aggregation.newAggregation(
// 挑选所需的字段,类似select *,*所代表的字段内容--要包含分组的字段和下面需要用到的字段
Aggregation.project("title", "status","createdtime","id"),
// sql where 语句筛选符合条件的记录
Aggregation.match(criteria),
// 分组条件,设置分组字段
Aggregation.group("status")
.first("title").as("title")
.first("id").as("id")
.count().as("total")
.sum("createdtime").as("createdtime"),
//按照total降序
Aggregation.sort(Sort.Direction.DESC,"total")
);
AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(aggregation,BugMeassge.class,Map.class);
List<Map> list = aggregationResults.getMappedResults();
System.out.println(list);
输出:
[{_id=new, title=【test】测试, id=1148699533001085067, total=2, createdtime=3324453364000}]
/*
* project:列出所有本次查询的字段,包括查询条件的字段和需要搜索的字段;
* match:搜索条件criteria
* unwind:某一个字段是集合,将该字段分解成数组
* group:分组的字段,以及聚合相关查询
* sum:求和(同sql查询)
* count:数量(同sql查询)
* as:别名(同sql查询)
* addToSet:将符合的字段值添加到一个集合或数组中
* sort:排序
* skip&limit:分页查询
*/
Aggregation.group(field1, field2).last(sortName).as(sortName)
group 是指要分组的字段
last是指保留最后一条评论的记录
as是其别名
Aggregation.group("zc2003004").first("zc2003004").as("zc2003004").count().as("allCount").sum("zc2003008").as("sum"),
已"zc2003004”字段分组,
展示zc2003004字段改其别名为zc2003004
展示count字段别名为allCount
展示 zc2003008 字段 sum(累加) 信息,改其别名为sum

浙公网安备 33010602011771号