SpringBoot整合MongoDB(2)

在用basedbobject拼接json对象时,当json特别长时,下面这个方法是一个合适的方法

String groupStr = "{\"$group\":{\"_id\":\"$name\",\"count\":{\"$sum\":1},\"avg_age\":{\"$avg\":\"$age\"},\"total_age\":{\"$sum\":\"$age\"},\"max_age\":{\"$max\":\"$age\"},\"min_age\":{\"$min\":\"$age\"}}}";
        DBObject dbObject = (DBObject) JSON.parse(groupStr);

1. 插入数据

1-1. 插入一条数据

User user = new User();
user.setName("woms");
user.setAge(15);
//db.user.insert({"name":"woms","age":15})
mongoTemplate.insert(user);

1-2. 插入多条数据

//> db.user.insert([{"username":"jj","age":11},{"username":"jj","age":11}])

List<User> list = new ArrayList<>();
User user = new User();
user.setAge(14);
user.setName("jj");
list.add(user);
mongoTemplate.insertAll(list);

2. 查询数据

db.collectionName.find({查询条件},{控制要显示的字段,可选项}) 数据查询也是使用json形式设置的相等关系 可选项中要显示的字段设置为1,不想显示的字段设置为0 对于查询而言,使用java-api的find()函数,只要知道bson写法,就能写api

2-1. 不带查询条件--查询全部

不带查询条件,查询全部数据

2-2. 不带查询条件--查询第一条

不带查询条件

2-3. 可选项,控制要查询的字段

2-4. 关系查询

大于("$gt")、小于("$lt")、大于等于("$gte")、小于等于("$lte")、不等于("$ne")、等于({"key":"value"}、"$eq")、模("$mod")

求模bson结构,db.user.find({"age":{"$mod":[20,1]}}),查询出所有年龄age除以20余数为1的数据记录,和其他的关系运算符不同,求模需要两个 数据运算,所以用数字表示

范例:查询name=woms95 and age >= 95的记录

心得:

  1. 一个json串“{}”就是一个BasicDBObject对象,查询条件可以使用json串,也可以使用BasicDBObject对象

  2. json串中逗号相隔的key:value,使用append(key,value)拼接

  3. 语法是json语法,格式是bson格式

2-5. 逻辑查询

与($and)、或($or)、非($not 、$nor)

bson结构中,逻辑运算付的级别最高

范例:name=woms-35 or age = 99

心得

  1. 一个{}就是一个BasicDBObject,{}的嵌套就是BasicDBObject的嵌套

  2. 嵌套中如果嵌套{},还用BasicDBObject如果嵌套[]就使用list

  3. nor是一个或(or)的求反功能

加深理解

2-6. 范围查询

在范围内("$in")、不在范围内("$nin")

范围的内容有多个,所以要用数组表示

范例:查询age范围在[1,3,5,7,9]内的所有记录数据

2-7. 数组查询

在MongoDB中支持数组保存,一旦支持了数组保存,就需要针对数组的数据进行匹配 可以使用MongoDB的BSON的几个操作符:all、size、slice、elemMathc

范例1:查询同时参加语文和数学的学生{“$all”,[内容1,内容2,…]}

范例2:控制数组显示的内容

范例3:指定索引位置元素查询

2-9. 模糊查询-正则查询

基础语法:{key:正则标记} 完整语法:{key:{“$regex":正则标记,"regex":正则标记,"$options”:"i"}}

对于options主要是设置正则的信息查询的标记:

“i” :忽略字母大小写; “m” :多行查找; “x” :空白字符除了被转义的或者在字符类中以外的完全被忽略; “s” :匹配所有的字符(圆点、”.”),包括换行内容

2-10. 排序分页

方式一

方式二

2-11. 距离索引查询

  1. 必须创建地理位置索引,而且在插入数据之前就预先创建好db.car_info.createIndex( { "location": "2dsphere" } )

  2. 索引字段使用的是geojson数据格式,格式如下,注意type的首字母是大写

范例1:计算点[115.21,40.31]半径为1英里范围内的所有点,这里1英里=1.6公里 3963.2为大约地球半径

注意: [[115.21,40.31],1/3963.2]java-json解析异常了,需要使用BasicDBObject结合数组使用

范例2:查询距离最近的点并且排序

3. 修改数据

upsert : 如果更新的数据不存在,就增加一条新的内容(true为增加,false不增加),默认false multi :表示是否只更新满足条件的第一条记录(false:只更新第一条记录,ture全部更新)默认false

3-1. 整行更新

整行更新,只跟新满足条件的第一条数据

多行同时更新(注意:多行更新不能整行覆盖,只能指定字段指定更新,这也正符合开发的规则)

跟新,不存在就插入数据

4. 删除数据

4-1. 根据条件删除

json串内的字符串可以用双引号+转义字符“\”,也可以使用单引号

4-2. 删除全部数据

5. 聚合操作

5-1. 统计个数

count({})函数内,用json去建立条件的相等关系

消除重复数据

语法如下

方式一:

方式二:

6. aggregate操作

  1. 在整个聚合框架里面。要引用每行的数据就采用“$”+ 字段名称

  2. 几个操作符可以同事使用

  3. 方法里的名称使用的是实体类的名称不是数据库字段的名称

6-1、$group

在MongoDB中会将集合依据指定的key的不同进行分组操作,并且每一个组都会产生一个处理的文档结果

{ $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } } _id是分组条件,如果_id设置为null,就是将整个文档作为一个整体组,不分组统计

数组显示$push

数组去重$addToSet

注意,所有的分组都是无序的

范例一:

范例二:

6-2、$project

https://docs.spring.io/spring-data/data-mongodb/docs/2.0.2.RELEASE/reference/html/#new-features.1-7-0

project可以用来控制列的显示规则,相当于结果集的投影功能

1、普通列({“成员”:1|true})表示要显示的内容 2、_id列({“_id”: 0|false})表示“_id”列是否显示 3、条件过滤列({“成员”:表达式})满足表达式之后的数据可以进行显示

6-3. $match

相当于where字句

6-4. $sort

1:升序 -1: 降序

6-5. 分页

$limit:负责数据的取出个数 $skip:负责数据的跨过个数

6-6. $unwind

在查询数据的时候,经常返回数组信息, 这个操作付的所用就是将数组信息转换成字符串

6-7. $geoNear

计算距离,必须要有索引的支持

6-8、$out

将查询结果输出到指定的集合里面(表的复制操作,生成一张新表)

Last updated

Was this helpful?