文章目录
一、数据库
1. 概念介绍
数据库是按照数据结构来组织、存储和管理数据的仓库。我们的程序在内存中运行,一旦程序运行结束或者计算机断电,程序运行中的数据都会丢失所以我们需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。而数据库就是数据持久化的最佳选择。说白了数据库就是存储数据的仓库。
2. 数据库分类
数据库主要分成两种:
- 关系型数据库(RDBMS):MySQL、Oracle、DB2、SQL Server…(关系型数据库中全是表)
- 非关系型数据库(No SQL):MongoDB(文档数据库)、Redis(键值对数据库)…
二、MongoDB入门
1. 简介
MongoDB是为快速开发互联网Web应用而设计的数据库系统。MongoDB设计目标是及简、灵活、作为Web应用栈的一部分,它的数据模型是面向文档的,所谓文档是一种类似JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON(BSON)。
MongoDB数据库分为两个部分,分别是数据库服务器,它是用来保存数据的;另一部分是数据库客户端,数据库客户端用来操作服务器,对数据进行增删改查。
MongoDB有三个基本概念:
- 数据库:数据库是一个仓库,在仓库中可以存放集合
- 集合:集合就是一组文档,也就是集合是用来存放文档的,集合中存储的文档可以是各种各样的,没有格式要求
- 文档:文档数据库中的最小单位,我们存储和操作的内容都是文档
2. MongoDB的基本操作
- 首先用客户端打开并连接到MongoDB
- 查看当前服务器有多少数据库
show dbs
- 进入并使用指定数据库
use test #test是数据库名
db
show collections
- 数据库的CRUD的操作
向数据库中插入数据
#插入多条数据
db.stus.insert([{name:"wohao",age:18,gender:"男"},{name:"nihao",age:23,gender:"男"}]);
#查询插入的数据
db.stus.find();
我们可以自己生成ID
ObjectId()
当然我们可以自己指定,但要自己确保唯一性
db.stus.insert({_id:"hello",name:"wohao",age:18,gender:"男"});
上面两个方法是3.2后新加的
向数据库中查询数据
#查询stus集合中的所有文档
db.stus.find();
#查询姓名为"wohao"的文档
db.stus.find({name:"wohao"})
db.stus.findOne({name:"wohao"})
上面同样可以用下面代码实现,因为find()本质上返回的是一个数组,而findOne返回的是一个对象
修改数据库中的数据
db.stus.update({ name: "wohao" }, { $set: {age: 100} });
db.stus.update({ name: "wohao" }, { $unset: {age: 100} });
#同时修改多个符合条件的文档
db.stus.updateMany({name:"wohao"},{ $set: {name:"张飞"}}) ;
#同时修改一个符合条件的文档
db.stus.updateOne():
实际上update()函数也是可以修改多个的,只要设置参数即可
db.stus.update({ name: "nihao" }, { $set: {name: "关羽"} },{multi:true});
#用于替换一个文档
db.stus.replaceOne();
删除数据库中的数据
首先记录一下原先数据库中的数据
#删除name为jack的文档
db.stus.remove({name="jack"});
#删除一个匹配到的文档
db.stus.remove({name="jack"},true);
#删除全部文档,这种清空集合的方式效率比较低,因为它要一条一条的删除集合中的数据
db.stus.remove({});
#删除stus集合
db.stus.drop()
#删除数据库
db.dropDatabase();
一般数据库中的数据都不会删除,所以删除的方法很少调用,在实际开发过程中我们会在表中添加一个字段,来实现逻辑删除,如下图isDelete就表示数据是否被删除。
3. MongoDB文档间的关系
MongoDB文档间的关系主要分为三种:
- 一对一
#文档中间嵌入文档
db.wifeAndhusband.insert({
name:"xiaomei",
hunsband:{
name:"xiaoshuai"
}
});
- 一对多/多对一
#创建user集合
db.users.insert([{_id:1,name:"java"},{_id:2,name:"python"}]);
#创建订单集合
db.Orders.insert([{
list: ["pg","xj","yl"],
user_id: 1
},
{
list: ["pg","xj","yl"],
user_id: 2
}
]);
#查询java的订单
var user_id=db.users.findOne({name:"java"})._id;
db.Orders.find({user_id:user_id});
- 多对多
首先创建老师
db.teacher.insert([
{name:"th"},
{name:"tw"},
{name:"tl"}
])
然后创建学生
db.student.insert([
{name:"xiaoli",teach_id:[ObjectId("65deb10745c350d729213802"),ObjectId("65deb10745c350d729213803"),ObjectId("65deb10745c350d729213804")]}
])
4. Sort和投影
db.score.insert([
{name:"xiaoming",score:78},
{name:"xiaozhang",score:89},
{name:"xiaoshuai",score:67},
{name:"xiaohua",score:13},
{name:"xiaoliu",scoer:99}
])
MongoDB中sort函数可以指定文档排序的功能。
#按照score升序排序
db.score.find().sort({score:1});
#按照score降序排序
db.score.find().sort({score:-1});
#先按照socer1先降序排序,再按照score升序排序
db.score.find().sort({score1:-1,score:1});
如果我们在查询文档的时候只想看到我们想看到的字段,这时候就可以使用投影技术。
#只看name不看_id字段
db.score.find({},{name:1,_id:0}).sort({score:1});