文章目录
- 前言
- 一、搭建项目
- 二、开始编写java代码
- 1. 新增
- 2.查询
- 3. 修改
- 4. 删除
- 5.根据条件查询
- 6. 关联查询
- 7. 索引相关
- 总结
前言
MongoTemplate 相关操作 CRUD,聚合查询等;
一、搭建项目
- springboot项目创建
- 引入mongo 依赖
- docker 安装好mongo数据库
- 配置yml 链接mongo
spring:
data:
mongodb:
host: 127.0.0.1
port: 27017
database: test
pom/gradle MongoTemplate 版本: 2.6.3
spring-boot-starter-data-mongodb
mongo可视化工具 robo3t
二、开始编写java代码
1. 新增
@Autowired
MongoTemplate mongoTemplate;
@Test
void add() {
List<ApplicationEntity> applicationEntityList = init();
Collection<ApplicationEntity> applicationEntities = mongoTemplate.insert(applicationEntityList, ApplicationEntity.class);
log.info("存储成功: {}", JSONUtil.toJsonStr(mongoTemplate.findAll(ApplicationEntity.class)));
}
private List<ApplicationEntity> init() {
List<ApplicationEntity> applicationEntityList = CollectionUtil.newArrayList();
for (int i = 0; i < 2; i++) {
String id = IdUtil.fastSimpleUUID();
String name = "第" + RandomUtil.randomNumbers(2) + "个应用";
ApplicationEntity applicationEntity = ApplicationEntity.builder()
.id(id)
.name(name)
.orgName(name)
.icon("https://www.baidu.com")
.status(RandomUtil.randomBoolean() ? "启用" : "禁用")
.type("application")
.build();
applicationEntityList.add(applicationEntity);
}
return applicationEntityList;
}
实体具体内容
2.查询
@Autowired
MongoTemplate mongoTemplate;
@Test
void queryField() {
Query query1 = new Query();
query1.fields().include("orgName", "name");
List<ApplicationEntity> applicationEntities = mongoTemplate.find(query1, ApplicationEntity.class);
System.out.println(JSONUtil.toJsonStr(applicationEntities));
}
1 include 查询指定字段,可以不指定,查询所有字段
2 ApplicationEntity 对应mongo数据库中的一个document
3. 修改
找到要修改的,并修改
@Test
void update() {
ApplicationDto applicationDto = new ApplicationDto();
applicationDto.setId("b8cbf05d102e454784ab85f23704bfb7");
applicationDto.setName("测试");
applicationDto.setStatus("启用");
applicationDto.setIcon("www.tupian");
Query query = new Query(Criteria.where("id").is(applicationDto.getId()));
Update update = new Update();
update.set("fileUrl", applicationDto.getIcon());
update.set("name", applicationDto.getName());
update.set("status", applicationDto.getStatus());
mongoTemplate.updateFirst(query, update, ApplicationEntity.class);
List<ApplicationEntity> all = mongoTemplate.findAll(ApplicationEntity.class);
System.out.println(JSONUtil.toJsonStr(all));
}
4. 删除
找到并删除
Criteria criteria = Criteria.where("pid").is(applicationDto.getId());
mongoTemplate.findAllAndRemove(new Query(criteria), MenuNavigationEntity.class);
5.根据条件查询
相当于
select * from a where id=1 or id =2;
@Test
void queryCondition() {
Query query1 = new Query(new Criteria()
.orOperator(Criteria.where("id").is("923406"), Criteria.where("id").is("3518177")));
List<MenuNavigationEntity> menuNavigationEntityList = mongoTemplate.find(query1, MenuNavigationEntity.class);
System.out.println(JSONUtil.toJsonStr(menuNavigationEntityList));
}
6. 关联查询
相当于
select *
from a
left join b on a.id = b.pid;
@Test
void queryLink() {
LookupOperation lookupOperation = LookupOperation.newLookup()
.from("menu_navigation")// 副表名称
.localField("_id")// 主表关联字段
.foreignField("pid")// 副表关联字段
.as("menu_navigation");// 副表别名
// 聚合条件
Aggregation aggregation = Aggregation.newAggregation(lookupOperation,
Aggregation.match(Criteria.where("menu_navigation.pid")// 副表关联的主表条件
.is("b8cbf05d102e454784ab85f23704bfb7")));
AggregationResults<JSONObject> aggregate = mongoTemplate.aggregate(aggregation, ApplicationEntity.class,
JSONObject.class);// 条件 主表类型 结果类型
List<JSONObject> mappedResults = aggregate.getMappedResults();
System.out.println(JSONUtil.toJsonStr(mappedResults));
}
7. 索引相关
@Test
void index() {
MongoCollection<Document> collection = mongoTemplate.getCollection("application");
collection.createIndex(new Document("id", "hashed"), new IndexOptions().name("index_id"));
// 唯一索引
collection.createIndex(new Document("id", "hashed"), new IndexOptions().unique(true).name("index_id"));
// 删除指定索引
collection.dropIndex("index_id");
// 删除所有索引
collection.dropIndexes();
}
总结
主要是展示了 MongoTemplate 中的CRUD的常规操作和 关联查询,之后会继续学习~~
还有个问题,就是我无法从已经标记为 文档的实体中获取 集合名称嘛? 现在我的代码中的集合名称都是字符串
还有就是字段名称也都是字符串,可以从这个 document 中获取嘛?
记录几个mongo的工具的 原生语句,模糊查询
// 模糊匹配createTime 是以 2019-07-23 开头
db.getCollection('driver_online_record').find({"createTime" : /^2019-07-23/})
// 模糊匹配createTime 包含 2019-07-23
db.getCollection('driver_online_record').find({"createTime" : /2019-07-23/})
// 模糊匹配createTime 是以 2019-07-23 结尾
db.getCollection('driver_online_record').find({"createTime" : /2019-07-23$/})
// 模糊匹配createTime 包含aaa 切忽略大小写
db.getCollection('driver_online_record').find({"createTime" : /aaa/i})
// 模糊匹配某个字段内容为json,再次根据json中的key模糊查询
db.getCollection("driver_online_record").find({"value.FilePath":/1234/})
其中value 自身为一个json,FilePath为其中的一个key
value内容
{
"FilePath" : "1234567",
"IsWeb" : true
}