MongoDB基本操作及整合SpringBoot使用

MongoDB基本操作

1. 配置信息

1.1 自动重启配置MongoDB服务

在WIN的环境下使用WIN + R键输入services.msc并且回车,找到MongoDB Serever(MongpDB)服务右键启动即可;

MongoDB的默认端口号为 :27017

2. 核心概念

2.1 库<DataBase>

MongoDB中的库也是类似于Mysql中的数据库,用来通过不同的库隔离不同的应用程序

可以建造多个库,每一个库都有自己的集合和权限,不同的数据库也放置在不同的文件当中;

默认的数据库为 test ,数据库储存在 指定的data目录当中

2.1.1 查看所有库
  • > show databases; | show dbs;

  • 从打印的信息来看一共有三个库;

    — admin 0.00GB

    — config 0.00GB

    — local 0.00GB

⚠️注意:

adminconfiglocal 这三个库是MongoDB的保留库。不要删除也不要随便对其进行操作;

admin:从权限角度来看,这是 root 库。如果将一个用户添加到这个数据库当中,这个用户将会自动继承所有的数据库的权限。一些特定的服务器端命令也只能从这个数据库运行。

​ 比如:列出所有的数据库或者关闭服务器;

config:当MongoDB用于分片设置时。config数据库在内部使用,用于保存分片的相关信息;

local: 这个数据永远不会被复制,可以用来储存限于本地单台服务器的任意集合;

2.1.2 创建数据库/切换

use DataBaseName;

⚠️注意:

只有当使用的库不存在的时候才会进行创造,如果存在则是切换至目标库;

use 代表创建并使用,当这个库中没有数据的时候是不显示这个库的;

查询当前在哪个数据库使用 db 进行查询 默认是 test 库;

2.1.3 删除数据库

db.dropDatabase();

删除当前选中的库;

⚠️注意:

虽然删除后确实是把数据库删除了,但是当你未切换成其它库或者退出时使用db来查询当前所在库时仍然是显示处在此库当中;

2.2 集合<Collection>

MongoDB中的集合就是其中的文档组(储存许多的文档),类似于Mysql数据库当中的表的作用

集合存在于数据库当中,一个库可以创建多个集合;

每个集合 没有固定的结构 。这意味着可以 在对集合插入不同格式和类型的数据 ,但通常情况下插入集合的数据都会有一定的关联性;

2.2.1 查看集合

show collections; | show tables;

2.2.2 创建集合

db.createCollection("collectionName", [options]);

创建集合又两个参数,第一个参数是填写 集合的名称,第二个参数是填写设置。如果不填写options则使用默认配置

Options部分参数:

字段 类型 描述
capped 布尔 (可选)如果为true,则创建固定集合。固定集合是指有着固定大小的集合;
如果参数达到了最大值,它会自动覆盖最早的文档。当该值为true时,必须制定size参数
size 数值 (可选)为固定集合制定一个指定的最大值,即字节数;
如果capped为true时,必须制定该字段的参数
max 数值 (可选)指定固定集合中包含文档的最大数量;

🌰

db.createCollection("collectionNmae", {
     max: 100, capped: true, size:1000})

当集合不存在时,向集合之中插入文档时,也会自动创建该集合

2.2.3 删除集合

db.collectionName.drop();

2.3文档<Document>

文档是集合中一条条记录,是一组键值对(key-value);

MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别;

这也是MongoDB非常突出的特点;

🌰

{
    
	"name": "urbaneH",
	"drink": "water"
}
2.3.1 插入文档
  • 单条文档

db.collectionName.insert({name: "UrbaneH", age: 18});

  • 多条文档
db.collectionName.insertMany(
	[<Document1>, <Document2>, ......],
	{
    
		writeConcern: 1, // 写入策略,默认为1,即要求确认写操作,如果为0,则是不要求;
		ordered: true // 指定是否按顺序写入,默认true;
	}
)
  // 例如 insert也可以不一定要insertMany;
db.collectionName.insert([
  {
    name: "xiaohua", "age": 17},
  {
    name: "xiaohu", "age": 18}
])
  • 脚本方式
for (let i = 0; i <= 100; i++){
    
	db.collectionName.insert({
    
		"_id": i,
		"name": "hahah",
		"age": i + 1;
	})
}

⚠️注意:

在MongoDB中每个文档都会有一个_id作为唯一标识,_id默认会自动生成如果手动指定将使用手动指定的值作为_id的值

2.3.2 查询集合所有

db.collectionName.find();

2.3.3 删除文档
db.collectionName.remove(
	<query>, // 条件;
	{
    					// 删除的配置对象;
		justOne: <boolean>, // 是否仅删除一条数据;
    		writeConcern: <Document> // 如果抛出意外,抛出的异常级别;
	}
);

如果 justOne 不选择或者参数为 false 则表示删除匹配到的所有文档;

如果remove不带有条件的话(但仍要在条件处带有 {}表示空条件),就是删除所有;

2.3.4 更新文档
db.collectionName.update(
	<query>,
	<update>,
	{
    
		upsert: <boolean>,
		mulit: <boolean>,
		wirteConcern: <Document>
	}
);

query:update的查询条件,类似sql update查询where后面的部分;

update:update的对象和一些更新的操作符(如$, $inc, …)等,也可以理解为sql update查询内的set后面的部分;

upsert可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,默认为 false 不插入;<boolaen>类型

mulit可选,这个参数的意思是,是否只更新找到的第一条数据,默认为 false ,如果为 true 则将所有查询到的数据都进行更新;<boolean>类型

wirteConcern可选,抛出的异常级别;

🌰

> db.collectionName.update({
   "name": "UrbaneH"}, {
   "name": "11", "bir": new date()})
--- 这个更新是将符合条件的全部更新成后面的文档,相当于先删除再更新;
> db.collectionName.update({
   "name": "UrbaneH"}, {$set: {
   "name": "xiaohua"}})
--- 保留原来的数据更新,但只更新符合条件的第一条数据;
> db.collectionName.update({
   "name": "UrbaneH"}, {$ser: {
   "name": "xiaohua"}}, {mulit: true})
--- 保留原来的数据更新,更新符合条件的所有数据;
> db.collectionName.update(
	{
   "name": "UrbaneH"},
	{$set: {
   "name": "xiaohua"}},
	{
		mulit: true,
		upset: true
	}
)
--- 保留原来的数据更新,更新符合条件的所有数据,没有符合条件时插入数据;
2.3.5 查询文档

db.collectionName.find(query, projection);

query可选 使用查询操作符指定查询条件;

projection可选 使用投影操作符指定返回的键。查询时返回文档中所有的键值,只需要省略该参数即可。默认为省略;

⚠️注意:

默认的查询是非结构化的,如果需要使得结果结构化也更加易读,需要在后面加上 pretty()

🌰

db.collectionName.find(query, projection).pretty();

2.3.5.1对比语法
操作 格式 范例 RDBMS中的类似语句
等于 {<key>:<value>} db.col.find({"by":"UrbaneH"}).pretty() where by = 'UrbaneH'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50
2.3.5.2 AND查询

db.collectionName.find({key1:value1, key2: value2});

如果相同的字段出现的话会以最后一次出现为准;

类似于 where 的 WHERE key1 = value1 AND key2 = value2;

2.3.5.3 OR查询
db.collectionName.find({
	$or: [
		{key1: value1}, {key2: value2}
	]
}).pretty()

类似于 WHERE key1 = value1 OR key2 = value2;

2.3.5.4 AND和OR查询

db.collectionName.find({"age": {$gt: 50}}, $or: [{"name": "UrbaneH"}, {"name": "MongoDb"}]).pretty();

这就类似于 WHERE age > 50 AND (name = “UrbaneH” OR name = “MongoDB”);

2.3.5.5 🌟数组中查询

db.collectionName.find({shuzu: "baohanneirong"})

⬆️表示查询shuzu中的数组包含baohanneirong的文档

只需要使用包含数组的字段作为键,要包含的值作为值就可以了;

db.collectionName.find({shuzu: {$size: 3}});

⬆️表示查询shuzu长度为3的数据

2.3.5.6 模糊查询

在MongoDB中,模糊查询是依靠正则表达式的方式来进行实现的;

以斜杠开头以斜杠结尾,不需要使用双引号包裹字符串,例如:

db.collectionName.find(name: {/U/});

⬆️表示查询name中包含U字符的文档

如果是对于数组的内容进行模糊查询也可以使用上述方法,MongoDB的正则可以直接匹配数组中所有元素;

例如一个文档中的shuzu: [“吃饭”, “喝水”,“睡觉”]

db.collectionName.find({shuzu: {/吃/}});

⬆️也可以匹配到

2.3.5.7 排序

db.collectionName.sort({key1: 1, key2: -1});

1是升序,-1是降序

2.3.5.8 分页

db.collectionName.find().sort({query}).limit(rows).skip(start);

1⃣️ sort 先根据需要的条件排序;

2⃣️ limit 是讲每页分为多少条数据;

3⃣️ skip 是指当前显示第几页;

2.3.5.9 总条数

db.collectionName.count();

db.collectionName.find({query}).counu();

2.3.5.10 🧹去重

db.collectionName.distinct("字段");

返回值是对应字段的剩余的值(去重后);

2.3.5.11 返回指定字段

这也是上文中提到的 projection 的内容;

db.collectionName.find({name: "UrbaneH"}, {age: 0});

⬆️表示查询集合中name的值为UrbaneH的数据,但不返回age字段;

⚠️注意:

0和1不可以同时使用;0:不返回1:返回;

如果使用了0则除了其字段其余都返回,如果使用了1则仅返回其字段

2.4 关系总结
RDBMS(关系型数据库) MogoDB(非关系型数据库)
数据库<DataBase> 数据库<DataBase>
表<Table> 集合<Collection>
行<Row> 文档<Document>
列<Colume> 字段<Field>

3. $type

说明</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值