MongoDB基础教程(数据库精讲)
MongoDB中文手册|官方文档中文版:
https://docs.mongoing.com/
MongoDB 中文手册
https://mongodb.net.cn/manual/
MongoDB:
一、数据库(database)
什么是数据库?
存储数据的仓库
为什么要有数据库?
首先数据是存储在内存里运行的,如果一断电的话,数据就会丢失,所以可以将数据存储到硬盘,但是硬盘没有联网,所以有了可以联网也可以存储数据的数据库。
数据库的分类
按照关系型分类:
1、关系型数据库(MySQL、Orcal等) 2、非关系型数据库(MongoDB)
关系型和非关系型的区别:
总而言之就是:关系型的是创建表格, 非关系型是可以创建任意多个文档。
1、数据存储方式不同。
关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
2、扩展方式不同。
SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。
因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来客服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。而NoSQL数据库是横向扩展的。
而非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
3、对事务性的支持不同。
如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。
二、MongoDB
①什么是MongoDB?
一种数据库,而且是非关系型数据库它是文档数据库。
②MongoDB的优点
1、可以快速开发web型应用,因为灵活,不用像关系型数据库一样需要建表
2、MongoDB存储的是文档(document),文档内存储的是类似json的结构,所谓json就是字符串数组(BSON)
三、MongoDB常见命令
1、安装MongoDB,去官网下载并安装,随后将bin文件设置成环境变量path的变量。
2、MongoDB常见的命令
Mongod开启服务器
mongo开启客户端
MongoDB的数据库分类
数据库(database):用来存储集合的,而且数据库也有分大小。
集合(collection):集合类似于数组,用于存放文档的
文档(document): 文档是MongoDB数据库中最小的单位,我们要操作的目标就是文档。
在MongoDB中不需要自己创建数据库和集合,便可以直接创建文档,其实就是在创建文档的同时,会将数据库和集合创建了。
基础代码:
use test; //进入数据库如果没有会自己创建不过前提是里面有东西
show dbs;/show databases; //都是显示数据库的
show collections; //显示当前数据库有什么集合
db; //查看是在哪一个数据库中
对mongodb数据库的CRUD操作
insert()方法淘汰了
db.collection.insert() 表示增加一个或多个文档
例如:
db.stus.insert({name: "孙悟空", age: 28, address:"花果山"});
/*
表示向 集合名为stus插入了文档, 文档内容是对象。
集合名是自己创建的,想用什么名称就用什么。
*/
db.stus.insert([
{name:"猪八戒", age: 38, address:"高老庄"},
{name: "沙和尚", age: 45, address:"流沙河"}
]);
/*
可以注意到: 传递的数据是数组,数组内部是对象,
其实对象就相当于文档,这就是插入了两个文档。
*/
db.stus.insertOne({name:"唐僧", age: 18, address: "女儿国"});
/*
表示向集合名为stus的 插入了一个文档。
*/
db.stus.insertMany([
{name:"白骨精", age:20,address:"白骨洞"},
{name:"蜘蛛精", age: 24, address:"蜘蛛洞"}
]);
/*
可以看到,用法是和insert是相差不多的。数组里面有对象,对象即是文档。
*/
/*
添加完成的时候会自动填一个_id唯一标识,也可以手动ObjectId();添加
*/
查找
要想查询上面插入的内容,便可调用查找的方法
/*
--查询全部
db.collection.find({});
-find()用来查询集合中所有符合条件的文档
-find()可以接收一个对象作为条件查询
-find返回的是数组
-{}查询集合所有的文档
-{字段名:值}查询属性是指定值的文档
db.controller.findOne();
-用来查询集合中符合条件的第一个文档
-findOne返回的是一个文档对象
db.collection.find().count();查询结果的数量
*/
例如:
db.stus.find({});
db.stus.find({age:18});
//这条语句表示的是查询age是18的文档。 值得注意的是,条件也是写在了对象里面,
//也是因为传入的值需要是json语句
如果想要知道有多少个的时候,则可以使用
db.controller.find().count(); 使用count()来计数
/*
修改
update方法淘汰
db.collection.update(查询条件,新对象);
-update()默认情况会使用新的对象来替换旧的对象
-如果需要修改指定的属性,而不是替换需要使用"修改操作符"未完成修改
-$set 可以用来修改文档中的指定属性
- $unset 可以用来删除文档的指定属性
db.collection.updateMany()
-同时修改多个符合条件的文档
db.collection.updateOne()
-修改一个符合条件的文档
db.stus.replaceOne()
-替换
-update自会修改一个
*/
例如:
db.stus.update({"_id":ObjectId("61711460e60c2c749a9186c2")},
{$set:{
gender:"男",
name:"沙和尚"
}
}
);
db.stus.update(
{"_id":ObjectId("61711460e60c2c749a9186c2")},
{
$unset:{
age:18
}
}
)
db.stus.updateMany(
{"name":"猪八戒"},
{
$set:{
address:"高老庄"
}
}
);
db.stus.replaceOne(
{"address":"呵呵呵"},
{
name:"猪八戒",
gender:"男",
address:"高老庄",
age:"12"
}
);
/*
删除:
db.collection.remove()
-删除符合条件的所有文档有几个删除几个默认删除多个
-如果remove()第二个参数是一个true,则只会删除一个
-如果只传递一个空对象作为参数则全部删除
db.collection.deleteOne()
db.collection.deleteMany()
-remove()可以根据条件删除文档,传递的条件的方式和find一样
db.collection.drop();
-删除集合
db.dropDatabase();
-删除数据库
--数据库中的数据一般都不会删除,所以删除的方法很少使用
一般在数据库中添加一个字段,表示是否被删除
查询的时候idDel:0
*/
例如:
db.stus.remove({gender:"男"});
有多个男删除多个
db.stus.remove({_id:"6170e410e60c2c749a9186bc"});
唯一删除一个
db.stus.remove({age:"38"},true);
假删除练习从创建库开始
/*
1.先删除数据库
2.查询数据库看删除了没有
3.创建数据库
4.添加数据只有添加数据库才算创建成功
5.加删除的字段0未删除1删除数据库的数据没事别删除
6.查询的时候只查询加删除字段为1的就行
*/
具体步骤如下:
db.stus.drop();
show dbs;
db.stus.find();
use test;
db.stus.insert([
{
name:"zbj",
isDel:0
},
{
name:"shs",
isDel:0
},
{
name:"ts",
isDel:0
}]
);
db.stus.updateOne({name:"ts"},{
$set:{
isDel:1
}
});
db.stus.find({isDel:0});