训练大纲MongoDb1

大家如果想快速有效的学习,思想核心是“以建立知识体系为核心”,具体方法是“守破离”。确保老师课堂上做的操作,反复练习直到熟练。

第145次(MongoDb3)

学习主题:MongoDb3

学习目标:

  1. 掌握mongodb正则查询
  2. 掌握mongodb聚合查询
  3. 掌握mongodb管道操作
  4. 掌握mongodb字符串操作
  5. 掌握mongodb算术运算
  6. 掌握mongodb日期处理
  7. Java连接MongoDB数据库的方式

对应文档:

对应作业

  1. Mongodb的正则查询?回忆之前的正则知识

i m g w ^ $都是什么意思?

i:不区分大小写以匹配大小写的情况

m:多行查找,如果内容里面不存在换行符合(例如n)或者条件上没有(start/end),该选项没有任何效果

g:可以进行全局匹配

w:数字0—9,字母a—z,A—Z

^:行的开头

$:行的结尾

如何实现正则查询 语法规则是?

db.COLLECTION_NAME.find({字段名:正则表达式})

db.COLLECTION_NAME.find({字段名:{$regex:正则表达式,$options:正则选项}});

  1. Mongodb的聚合操作。

如何实现聚合查询,通过__aggregate____函数完成。

语法格式是:

db.COLLECTION_NAME.aggregate([{$group:{_id:"$分组键名","$分组键名",.....,别名:{聚合 运算:"$运算列"}}},{条件筛选:{键名:{运算条件:运算值}}}])

$match $group $sort $sum $push $unwind分别代表什么意思。




mongodb project 取集合里第一条 mongodb查询集合_字符串的切片操作与连接


  1. 什么是管道操作。

管道在 Unix 和 Linux 中一般用于将当前命令的输出结果作为下一个命令的参数。MongoDB 的聚合管道将 MongoDB 文档在一个管道处理完毕后将结果传递给下一个管 道处理。管道操作是可以重复的。

管道操作符是按照书写的顺序依次执行的,每个操作符都会接受一连串的文档,对这些 文档做一些类型转换,最后将转换后的文档作为结果传递给下一个操作符(对于最后一个管 道操作符,是将结果返回给客户端),称为流式工作方式。

管道操作符:$match、$group、$sort、$limit、$skip、$unwind

管道操作符,只能用于计算当前聚合管道的文档,不能处理其它的文档

  1. 如何实现聚合投影约束,举例说明。

$project-聚合投影约束

例:查询 dev 集合,将数组中的内容拆分显示,并只显示 title 键与 tags 键的值

db.dev.aggregate([{$unwind:"$tags"},{$project:{_id:0,tags:"$tags",title:"$title"}}])


mongodb project 取集合里第一条 mongodb查询集合_汉字字符内码查询_02


  1. 字符串操作,回忆数据库中的字符串操作。

将内容变为大/小写

全部转为大写: uppper()

全部转为小写:lower()

截取汉字和截取非中文是否有区别?

一个汉字占3个字符,在使用$substr进行截取时,要截取的字符个数必须是3的整数倍,或者使用$substrCP进行截取

$substr截取


mongodb project 取集合里第一条 mongodb查询集合_汉字字符内码查询_03


$substrCP截取


mongodb project 取集合里第一条 mongodb查询集合_字符串的切片操作与连接_04


使用$substr进行截取,但截取的个数不是3的整数倍会报错


mongodb project 取集合里第一条 mongodb查询集合_字符串的切片操作与连接_05


  1. 算术运算符如何使用 语法结构是?

加法 乘法 除法 取模 分别怎么表示

加法:$add

查询 dev 集合中数据,显示 title 和 size 字段,为 size 字段数据做加 1 操作,显示字段 命名为 New_Size

db.dev.aggregate([{$project:{_id:0,title:1,New_Size:{$add:["$size",1]}}}])


mongodb project 取集合里第一条 mongodb查询集合_汉字字符内码查询_06


减法:$subtract

查询 dev 集合中数据,显示 title 和 size 字段,为 size 字段数据做减 1 操作,显示字段 命名为 New_Size

db.dev.aggregate([{$match:{size:{$ne:null}}},{$project:{_id:0,title:1,New_Size:{$subtract:[ "$size",1]}}}])


mongodb project 取集合里第一条 mongodb查询集合_字符串的切片操作与连接_07


乘法:$multiply

查询 dev 集合中数据,显示 title 和 size 字段,为 size 字段数据做乘 2 操作,显示字段 命名为 New_Size

db.dev.aggregate([{$match:{size:{$ne:null}}},{$project:{_id:0,title:1,New_Size:{$multiply: ["$size",2]}}}])


mongodb project 取集合里第一条 mongodb查询集合_字符串的切片操作与连接_08


除法:$divide

查询 dev 集合中数据,显示 title 和 size 字段,为 size 字段数据做除 2 操作,显示字段 命名为 New_Size

db.dev.aggregate([{$match:{size:{$ne:null}}},{$project:{_id:0,title:1,New_Size:{$divide:[" $size",2]}}}])


mongodb project 取集合里第一条 mongodb查询集合_字符串的切片操作与连接_09


取模:$mod

查询 dev 集合中数据,显示 title 和 size 字段,为 size 字段数据做模 2 操作,显示字段 命名为 New_Size

db.dev.aggregate([{$match:{size:{$ne:null}}},{$project:{_id:0,title:1,New_Size:{$mod:["$s ize",2]}}}])


mongodb project 取集合里第一条 mongodb查询集合_汉字字符内码查询_10


  1. 日期处理

插入日期的方式有几种,分别是。

插入系统时间(MongoDB 中的系统时间会比北京时间少 8 个小时)

db.dev.insert({time:new Date()})


mongodb project 取集合里第一条 mongodb查询集合_字符串的切片操作与连接_11


使用new Date()插入指定时间

db.dev.insert({time:new Date("2019-11-04T14:01:23Z")})


mongodb project 取集合里第一条 mongodb查询集合_汉字字符内码查询_12


使用ISODate()插入指定时间

db.dev.insert({time:ISODate("2019-11-04T14:04:33Z")})


mongodb project 取集合里第一条 mongodb查询集合_字符串的切片操作与连接_13


查询日期的方式有几种,分别是。

查询所有日期

db.dev.find({time:{$ne:null}})


mongodb project 取集合里第一条 mongodb查询集合_汉字字符内码查询_14


使用new Date()查询指定日期

db.dev.find({time:{$eq:new Date("2019-11-04T05:56:23.408Z")}})


mongodb project 取集合里第一条 mongodb查询集合_字符串的切片操作与连接_15


使用ISODate()查询日期

db.dev.find({time:{$gt:ISODate("2019-11-04")}})


mongodb project 取集合里第一条 mongodb查询集合_字符串的切片操作与连接_16


显示年月日如何写代码。

db.dev.aggregate([{$match:{name:"admin"}},{$project:{年:{$year:"$birth"},月:{$month:"$birth"},日:{$dayOfMonth:"$birth"}}}])


mongodb project 取集合里第一条 mongodb查询集合_字符串的切片操作与连接_17


显示年月日时分秒如何操作。

db.dev.aggregate([{$match:{name:"admin"}},{$project:{年:{$year:"$birth"},月:{$month:"$birth"},日:{$dayOfMonth:"$birth"},时:{$hour:"$birth"},分:{$minute:"$birth"},秒:{$second:"$birth"},毫秒:{$millisecond:"$birth"}}}])


mongodb project 取集合里第一条 mongodb查询集合_汉字字符内码查询_18


显示年月日时分秒星期几,全年的第几周,全年的第几天(周日为1,周六为7,全年的周计数从0开始)

db.dev.aggregate([{$match:{name:"admin"}},{$project:{年:{$year:"$birth"},月:{$month:"$birth"},日:{$dayOfMonth:"$birth"},时:{$hour:"$birth"},分:{$minute:"$birth"},秒:{$second:"$birth"},毫秒:{$millisecond:"$birth"},星期:{$dayOfWeek:"$birth"},全年的第几周:{$week:"$birth"},全年的第几天:{$dayOfYear:"$birth"}}}])


mongodb project 取集合里第一条 mongodb查询集合_字符串的切片操作与连接_19


自定义格式


mongodb project 取集合里第一条 mongodb查询集合_汉字字符内码查询_20


  1. java连接MongoDB数据的方式有哪些,分别是什么?
直连不带用户认证
public class MongoDBUtil {

	private static MongoClient client = null;
	static{
		if(client == null){
 client = new MongoClient("192.168.170.128", 27017);
		}
	}
 
	//获取mongodb数据库
	public static MongoDatabase getDatabase(String dbName){
		return client.getDatabase(dbName);
	}
 
	//获取mongodb中的集合
	public static MongoCollection getCollection(String dbName,String collName){
		MongoDatabase database = getDatabase(dbName);
		return database.getCollection(collName);
	}
}


直连带用户认证
public class MongoDBAuthUtil {

	private static MongoClient client = null;
	static{
		if(client == null){
			//封装用户认证信息
			MongoCredential credential = MongoCredential.createCredential("itsxt", "develop", "itsxtpwd".toCharArray());
			//封装mongodb的地址与端口
			ServerAddress address = new ServerAddress("192.168.170.128", 27017);
 
 client = new MongoClient(address, Arrays.asList(credential));
		}
	}
 
	//获取mongodb数据库
	public static MongoDatabase getDatabase(String dbName){
		return client.getDatabase(dbName);
	}
 
	//获取mongodb中的集合
	public static MongoCollection getCollection(String dbName,String collName){
		MongoDatabase database = getDatabase(dbName);
		return database.getCollection(collName);
	}
}


池连不带用户认证
public class MongoDBPoolUtil {

	private static MongoClient client = null;
	static{
		if(client == null){
			MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
			builder.connectionsPerHost(10);//每个地址的最大连接数
			builder.connectTimeout(5000);//连接超时时间,单位毫秒
			builder.socketTimeout(5000);//读写操作超时时间
			ServerAddress address = new ServerAddress("192.168.170.128", 27017);
 client = new MongoClient(address,builder.build());
		}
	}
 
	//获取mongodb数据库
	public static MongoDatabase getDatabase(String dbName){
		return client.getDatabase(dbName);
	}
 
	//获取mongodb中的集合
	public static MongoCollection getCollection(String dbName,String collName){
		MongoDatabase database = getDatabase(dbName);
		return database.getCollection(collName);
	}
}


池连带用户认证
public class MongoDBAuthPoolUtil {

	private static MongoClient client = null;
	static{
		if(client == null){
			MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
			builder.connectionsPerHost(10);//每个地址的最大连接数
			builder.connectTimeout(5000);//连接超时时间,单位毫秒
			builder.socketTimeout(5000);//读写操作超时时间
 
			MongoCredential credential = MongoCredential.createCredential("itsxt", "develop", "itsxtpwd".toCharArray());
 
			ServerAddress address = new ServerAddress("192.168.170.128", 27017);
 client = new MongoClient(address,credential,builder.build());
		}
	}
 
	//获取mongodb数据库
	public static MongoDatabase getDatabase(String dbName){
		return client.getDatabase(dbName);
	}
 
	//获取mongodb中的集合
	public static MongoCollection getCollection(String dbName,String collName){
		MongoDatabase database = getDatabase(dbName);
		return database.getCollection(collName);
	}
}


  1. Java操作mongoDB集合
创建集合(需要进行用户认证)先获取mongodb的数据库,然后创建集合
public static void createCollection(String dbName,String collName){
	MongoDatabase database = getDatabase(dbName);
	database.createCollection(dbName);
}


获取集合(先获取mongodb的数据库)
public static MongoCollection getCollection(String dbName,String collName){
	MongoDatabase database = getDatabase(dbName);
	return database.getCollection(collName);
}


删除集合
public static void dropCollection(MongoCollection coll){
	coll.drop();
}


获取mongodb数据库的方法
public static MongoDatabase getDatabase(String dbName){
		return client.getDatabase(dbName);
	}


分享/讲解/扩展思考

点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。