前言
背景
入职新公司使用的mongoDB,目前个人情况是会使用mongoDB去做业务操作,使用整合好的MongoTemplate类去进行常见的操作,随来深入学习下加深自己的理解, 学习下操作方法,后续再更新mongo背景及相关细节配置
操作一共分为三个部分 新增/更新 删除 查询 其中 查询是重点,因为我们使用了Spring整合 mongodb,
在使用的时候会去自动执行新建表及插入数据的操作,不需要我们手动的去创建表及对应的数据,再加上能
存上数据库的文件很少会去涉及删除这个概念,改也很少,具体在查询处介绍Criteria对应的方法列表,及对应类型对照表
依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
具体的配置及相关引用可以找网上的文章操作 连接工具推荐使用Navicat15 MongoDB版使用,可以查看多种视图json,文档,树等,还有各种操作优化等
增删改查操作
一 最简单的更新及插入操作
插入
Map data = new HashMap();
data.put("name","xxxx");
data.put("sex","yyyy");
data.put("date",new Date());
mongoTemplate.insert(data,"why"); //why为表名
更新
更新的具体操作等到后面查询再去叙述.思路是将查询出来的数据和要修改的数据进行匹配修改
criteria就是将查询条件进行组装 , and 就是组装 key is 就是对应value="";
Criteria criteria = new Criteria();
criteria.and("date").is("yyyy-MM-dd hh:MM:ss");
Query query=new Query();
Update update = Update.update("name","xxx").set("sex","yyy");
mongoTemplate.updateFirst(query, update, Map.class,"why");
二 最简单的删除操作
这里的Criteria.where意思和上面的criteria是相同的,不过一个是Criteria方法提供的静态方法,一个是内部公共方法
Criteria where = Criteria.where("date").is("yyyy-MM-dd hh:MM:ss")
Query query = new Query(where);
long count = mongoTemplate.remove(query,Map.class,"why").getDeletedCount();
三 最简单的查询操作
项目中使用Criteria来做mongo条件的拼接,所以在Dao层使用Criteria组装查询条件,作为参数创建查询Query对象,最后调用mongoTemplate的find()方法
Criteria criteria = new Criteria(); //1
criteria.and("plate_no").is(plateNo);
Query query = new Query(criteria); //2
return mongoTemplate.find(query,T.class,
T.collectionName(startDate)); //3
Criteria类
官方介绍
>Central class for creating queries. It follows a fluent API style so that you can easily chain together multiple criteria. Static import of the 'Criteria.where' method will improve readability.
>
> 用于创建查询的中央类。它遵循流利的API风格,因此您可以轻松地将多个条件链接在一起。静态导入“ Criteria.where”方法将提高可读性
可以看到Criteria类的功能就是用来把我们的条件进行拼接,进行组装存储到Criteria这个类中
Criteria的底层方法
private @Nullable String key;
private List<Criteria> criteriaChain; //定义criteriaChain 集合
private LinkedHashMap<String, Object> criteria = new LinkedHashMap<String, Object>();
//定义criteriaMap
private @Nullable Object isValue = NOT_SET;//赋予一个初值
//~~~~~~~~~~~
/**
* 构造方法 相当于List<Criteria> criteriaChain =new ArrayList<Criteria>();
*/
public Criteria() {
this.criteriaChain = new ArrayList<Criteria>(); //创建一个集合 泛型为Criteria
}
//具体如下所示
Criteria的方法表如下:
Criteria方法对应表
权限 | 方法名 | 参数 | 参数释义 | 参数限制 | 返回值 | 作用 | 代码 |
---|---|---|---|---|---|---|---|
public | where | String key | 参数的key | 允许为空 | Criteria | 把多个条件组合在一起 | - |
public | and | String key | 参数的key | 允许为空 | Criteria | 标准查询拼接 | new Criteria(this.criteriaChain, key); |
public | is | Object o | 参数的value | 允许为空 | Criteria | 标准等值方法 | this.isValue = o; |
private | lastOperatorWasNot | - | - | - | boolean | 用于方法内部判断 | 判断criteria为空或者$not操作符在最后 |
public | ne | Object o | 参数的value | 允许为空 | Criteria | 不等于 o | criteria.put("$ne", o); |
public | lt | Object o | 参数的value | 不允许为空 | Criteria | 小于 o | criteria.put("$lt", o); |
public | lte | Object o | 参数的value | 不允许为空 | Criteria | 小于等于 o | criteria.put("$lte", o); |
public | gt | Object o | 参数的value | 不允许为空 | Criteria | 大于o | criteria.put("$gt", o); |
public | gte | Object o | 参数的value | 不允许为空 | Criteria | 大于等于 o | criteria.put("$gte", o); |
public | in | Object o | 参数的value | 不允许为空且必须为同一类型 | Criteria | 在 o 里 | criteria.put("$in", Arrays.asList(o)); |
public | in | Collection<?> c | 参数的value | 不允许为null | Criteria | 在 o 里 | criteria.put("$in", c); |
public | nin | Object… o | 参数的value | 不允许为空 | Criteria | 不在 o 里 | nin(Arrays.asList(o)); |
public | nin | Collection<?> c | 参数的value | 不允许为null | Criteria | 不在 o 里 | criteria.put("$nin", o); |
public | mod | Number value, Number remainder | value 操作数 remainder 余值 | 不允许为null且必须为数字型 | Criteria | 取模,高级查询 | List l = new ArrayList(); l.add(value); l.add(remainder); criteria.put("$mod", l); |
public | all | Object… o | 参数的value | 不允许为空 | Criteria | 全匹配,高级查询,不同于in,必须所有符合规则才可以 | all(Arrays.asList(o)); |
public | all | Collection<?> o | 参数的value | 不允许为空 | Criteria | 全匹配,高级查询,不同于in,必须所有符合规则才可以 | criteria.put("$all", o); |
public | size | int s | 参数的value | 不允许为空 | Criteria | 查找数组元素个数 | criteria.put("$size", s); |
public | exists | boolean b | true/false | 不允许为空 | Criteria | 1.当boolean为true,匹配包含字段的文档,包括字段值为null的文档。 2.当boolean为false,返回不包含对应字段的文档。 | criteria.put("$exists", b); |
public | type | int t | 类型的对应数字 | 不允许为空 | Criteria | 基于类型返回结果,具体类型对应如下表格 | criteria.put("$type", t); |
public | not | - | - | - | Criteria | return not(null) | |
private | not | Object value | 参数的value | 允许为空 | Criteria | 私有方法,用于判断不是 | criteria.put("$not", value); |
public | regex | String re | 正则匹配 | 不允许为空 | Criteria | 设置正则匹配,option为空 | - |
public | regex | String re, String options | 正则匹配 | options允许为空 | Criteria | 设置正则匹配,re及option | return regex(toPattern(re, options)); |
public | regex | Pattern pattern | Pattern类 | 不允许为空 | Criteria | 设置正则匹规则配,Pattern规则 | if (lastOperatorWasNot()) { return not(pattern); } this.isValue = pattern; return this; |
public | regex | BsonRegularExpression regex | BsonRegularExpression类 内包括(re,options) | 不允许为空 | Criteria | 设置正则匹配 规则 | this.isValue = regex; |
private | toPattern | String regex, String options | 正则匹配 | options允许为空 | Criteria | 设置正则匹配规则 | Pattern.compile(regex, options == null ? 0 : BSON.regexFlags(options)); |
public | withinSphere | Circle circle | 中心圆及半径 | 不允许为null | Criteria | 空间查询在范围内 | criteria.put("$geoWithin", new GeoCommand(new Sphere(circle))); |
public | within | Shape shape | 所有的图形类 | 不允许为null | Criteria | 空间查询在范围内 | criteria.put("$geoWithin", new GeoCommand(shape)); |
public | near | Point point | 坐标点 x,y | 不允许为null | Criteria | 地理查询接近 | criteria.put("$near", point); |
public | nearSphere | Point point | 坐标点 x,y | 不允许为null | Criteria | 球面几何计算$nearSphere 的距离 | criteria.put("$nearSphere", point); |
public | intersects | GeoJson geoJson | GeoJson格式定义的结构 | 不允许为null | Criteria | 根据GeoJson检索位置 | criteria.put("$geoIntersects", geoJson); |
public | maxDistance | double maxDistance | 最大距离 | 不允许为null | Criteria | 根据最大距离匹配 | if (createNearCriteriaForCommand(“ n e a r " , " near", " near","maxDistance”, maxDistance) || createNearCriteriaForCommand(“ n e a r S p h e r e " , " nearSphere", " nearSphere","maxDistance”, maxDistance)) { return this; } criteria.put("$maxDistance", maxDistance); |
public | minDistance | double minDistance | 最小距离 | 不允许为null | Criteria | 根据最小距离匹配 | 同上 criteria.put("$minDistance", minDistance); |
public | elemMatch | Criteria c | 匹配的内嵌文档 | 不允许为null | Criteria | 包含数组字段的文档与至少一个匹配所有指定查询条件的元素进行匹配 | criteria.put("$elemMatch", c.getCriteriaObject()); |
public | alike | Example<?> sample | 示例 | 不支持嵌套或者分组.不支持字符串的开始、包含、结束和正则表达式匹配 | Criteria | 示例查询 | criteria.put("$example", sample); |
public | orOperator | Criteria… criteria | 文档 | 不允许为null | Criteria | 使用or运算符为所有提供的条件创建一个“ or”条件 or 多查询 | BasicDBList bsonList = createCriteriaList(criteria); return registerCriteriaChainElement(new Criteria("$or").is(bsonList)); |
public | norOperator | Criteria… criteria | 文档 | 不允许为null | Criteria | 使用nor运算符为所有提供的条件创建一个“ nor”条件 nor 多查询 | BasicDBList bsonList = createCriteriaList(criteria); return registerCriteriaChainElement(new Criteria("$nor").is(bsonList)); |
public | andOperator | Criteria… criteria | 文档 | 不允许为null | Criteria | 使用and运算符为所有提供的条件创建一个“ and”条件and 多查询 | BasicDBList bsonList = createCriteriaList(criteria); return registerCriteriaChainElement(new Criteria("$and").is(bsonList)); |
方法基本上差不多这些,但是具体的组合很多,根据根据业务需求尝试,复杂查询的操作需要用template提供的方法对象具体去使用
MongoDB类型对照表 来源: 菜鸟教程mongodb
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃。 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1 . |
Max key | 127 |
可以看到 crriteriaChain里面存储了我们添加的查询条件 因为是is相等条件,所以返回isValue=“黑AJ72J3”,这是一个最简单的查询
Query类
赋值给Query,这个样子一个简单的查询就完成了
Query: { "plate_no" : "黑AJ72J3" }, Fields: { }, Sort: { }
MongoTemplate类
方法比较多,但是基本上我们需要操作的方法就5类
1. save()方法 //save 保存或更新
2. delete() 方法 //delete 删除操作
3. get() 方法 //get 操作
4. find() 方法 //find() 查找
5. collectionExists()方法 //判断文档是否存在
思路上也和我们操作SQL一样,两者有很多的共同点,因为是查询模块所以主要使用find方法
整理基本大致查询操作
Criteria criteria = new Criteria(); //创建Criteria类 作为条件
//--------------------组装criteria查询条件---------------------
Query query = new Query(criteria); //将criteria对象作为参数创建查询对象
// 根据具体的需求去确认查询条件 得到结果集
List<DvsGps> dvsGpsList = super.find(query, DvsGps.class, DvsGps.collectionName(new Date()));
结束
这篇主要是将mongoTemplate的业务操作,会缺少mongo的原生Sql和mongo的背景及场景,后续再进行补充,目前先这样了.会操作使用为主.