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
⚠️注意:
admin
、config
、local
这三个库是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> |