最近项目中用到Mongodb,遇到问题在网上查找发现很多都写的很模糊,本文用来记录我已使用过的Mongodb实例,后续有新的实例会补充进来。
首先说明,我使用 spring-data 的 MongoTemplate 来操作 Mongodb 的,操作很简单,就是将MongoTemplate注入到项目中,使用里面的API操作就行了,这个不用多说,真正麻烦的是如何拼接Query这个条件。
Query:用来封装所有条件对象
Criteria:用来构建条件
查看了Criteria的API源码,这个对象有下图这些方法:
对应关系(与mongodb的操作符对应):
mongodb操作符官方文档:https://docs.mongodb.com/manual/reference/operator/update/
基本操作符如下图:
使用场景:
扫描二维码关注公众号,回复:
11895309 查看本文章
1、查询 user 表中字段 _id 为 1 的数据
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(1));
List<User> users = mongoTemplate.find(query, User.class, "user");
2、查询 user 表中字段 name 包含 张;班级 为 5 的数据
Query query = new Query();
Criteria criteria = new Criteria();
criteria.and("name").regex(Pattern.compile("^.*张.*$", Pattern.CASE_INSENSITIVE));
criteria.and("classNum").is(5);
query.addCriteria(criteria);
List<User> users = mongoTemplate.find(query, User.class, "user");
3、查询 USER 表中字段 achievement 中的子集合中的 curriculum 为 数学;fraction 大于 60的数据
Query query = new Query();
Criteria criteria = Criteria.where("achievement").elemMatch(
Criteria.where("curriculum").is("数学").and("fraction").gt(60)
);
query.addCriteria(criteria);
List<User> users = mongoTemplate.find(query, User.class, "user");
4、聚合查询,显示和排除指定的查询结果
Query query = new Query();
query.fields().exclude("_id");
query.fields().include("name");
List<User> users = mongoTemplate.find(query, User.class, "user");
5、子集合中同时判断两个条件,portions.items 的子集合中 name 为 身高;同时 value 为 空 或者 NULL 的(未测试过,不一定正确)
Criteria.where("portions.items").elemMatch(
Criteria.where("name").is("身高")
.orOperator(Criteria.where("value").is(""), Criteria.where("value").is(null))
);
6、拼接条件
query.add多个creterria默认为and关系
Query query = new Query();
Criteria criteria = new Criteria();
if(StringUtils.isNotBlank(req.getPatientName())) {
criteria.and("patientName")
.regex(Pattern.compile("^.*"+req.getPatientName()+".*$", Pattern.CASE_INSENSITIVE));
}
if(StringUtils.isNotBlank(req.getUserId())) {
criteria.and("orgCode").is(req.getUserId());
}
query.addCriteria(criteria);
Query query = new Query();
if(StringUtils.isNotBlank(req.getPatientName())) {
query.addCriteria(Criteria.where("patientName")
.regex(Pattern.compile("^.*"+req.getPatientName()+".*$", Pattern.CASE_INSENSITIVE)));
}
if(StringUtils.isNotBlank(req.getUserId())) {
query.addCriteria(Criteria.where("orgCode").is(req.getUserId()));
}
7、分页查询
// skip = 跳过条数;limit - 获取条数
query.skip((req.getOffset()-1)*10).limit(req.getLimit());