数据库(database)
概述
数据库是按照数据结构组织、存储和管理数据的仓库。
我们的程序都是在内存中运行的,一旦程序运行结束或者计算机断电,程序运行中的数据都会丢失。
所以我们需要将一些程序运行的数据持久化到硬盘中,以确保数据的安全性。而数据库就是持久化的最佳选择。
数据库就是存储数据的仓库。
数据库分类
数据库主要分为两类:
关系型数据库(RDBMS):MySQL、Oracle、DB2、SQL server…都是关系型数据库,关系型数据库里全部都是表。
非关系型数据库(NoSQL Not Only SQL):MongoDB、Redis…都是非关系型数据库,采用键值对数据库、文档数据库。
MongoDB
概述
MongDB是为快速开发移动互联网Web应用而设计数据库系统。
MongDB的设计目标是极简、灵活、作为Web应用栈的一部分。
MongDB的数据库模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongDB这个数据库中存在的是各种各样的JSON数据。(BSON)
三个概念
数据库(database):数据库是一个仓库,在仓库中可以存放集合。
集合(collection):集合类似于数组,在集合中可以存放文档。
文档(document):文档数据中的最想单位,我们存储和操作的内容都是文档。
安装
MongoDB的版本偶数为稳定版,基数为开发板。
MongoDB对于32位系统支持不佳,所以3.2版本以后没有再对32位系统支持。
第一步:mongodb下载。
第二步:将下载mongodb.tgz双击解压,移动到’usr/local/'目录下,[sudo mv mongodb /usr/local]。
第三步:配置环境变量打开.bash_profile,[open -e .bash_profile],加入如下配置后,使配置生效运行[source .bash_profile]。
export PATH=${PATH}:/usr/local/mongodb/bin
第四步:输入[mongod -version],查看是否安装成功。
第五步:需要手动创建db文件夹,mongodb默认不会自动创建[sudo mkdir /data/db]。
第六步:运行启动服务端[sudo mongod]。
第七步:另外启动一个控制台,进入mongodb,输入命令[mongo]。输入一下两行代码测试是否成功。
use admin;
db.shutdownServer();
如果安装过程中出现错误,一般是两种情况,路径问题’/data/db’或者权限问题
解决方法1:
1、删除.lock文件,[sudo rm /var/lib/mongodb/mongod.lock ]
2、修复mongodb,[mongod –repair]
3、启动mongod服务器,[sudo service mongod start]
4、启动mongo客户端,[mongo]
解决方法2:
1、cd /usr/local/mongodb/bin
2、./mongod –dbpath = /data/db/ --port 27017 [注意/data/db/为你创建的路径]
解决方法3:
1、在启动mongodb时,运行没有权限,[sudo mongod]
2、mongo
基本指令
[show dbs|show databases],显示当前的所有数据库。
[use 数据库名],进入到指定的数据库中。
[db],db表示的是当前所处的数据库。
[show collections],显示数据库中所有的集合。
[db..insert(document)],向集合中插入一个文档,例子:向test数据库stus集合中插入学生对象[db.stus.insert({name:“悟空”,age:18,gender:“男”})]。
[db..find()],查询当前集合中的所有文档。
需要注意的是当我们创建文档时,如果所在的文档的集合或数据库不存在会自动创建数据库和集合。
插入
[db..insert(document)],向一个集合中插入一个或多个文档。当我们向集合中插入文档时,如果没有给定文档的_id属性,则数据库会自动给文档添加_id,该属性作为文档的唯一标识。_id我们可以自己自定,如果我们指定了,数据库则不会自动添加,如果是自己添加的一定要确保的_id唯一性。
[db..insertOne(document)],插入一个文档对象。
[db..insertMany(document)],插入多个文档对象。
查询
[db..find()],find()用来查询集合中所有符合条件的文档,find()可以接收一个参数作为条件参数,{}表示查询集合中所有的文档,{属性:值}查询属性是指定值的文档。
[db..findOne()],用来查询集合中符合条件的第一个文档,findOne()返回的是一个对象。
[db..find({}).count() | db..find({}).length()],查询所有结果的数量。
[db..find({},{name:1,age:0})],投影就是显示哪些字段和不显示哪些字段,0为不显示,1为显示。
修改
[db..update(查询条件,新对象)],update()默认会使用新对象替换旧对象,如果需要修改指定的属性值需要使用"修改操作符"来完成修改[$set:可以修改文档中的指定属性 | $unset:可以用来删除文档的指定属性],update()默认只会修改一个文档对象,{upsert:, multi:, writeConcern:, collation:}可以指定如上属性做相应操作。
[db..updateOne()],修改一个符合条件的文档。
[db..updateMany()],修改多个符合条件的文档。
[db..replaceOne()],替换一个符合条件的文档。
删除
[db..remove()],删除一个或多个,可以将第二个参数传递一个true,则只会删除一个。如果传递一个空对象作为参数,则会删除所有。
[db..deleteOne()],删除一个文档对象。
[db..deleteMany()],删除多个文档对象。
[db..drop()],删除集合。
[db..dropDatabase()],删除数据库。
一般数据库中都不会全部删除,都会通过一个字段作为标识删除或者未删除,在通过fond(isFlag:0)进行一个查询获取未删除的数据,如果isFlag:1,则标识逻辑删除。
条件运算符
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<=) 小于等于 - $lte
方法
Limit()方法:如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
Skip()方法:我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
Sort()方法:在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。例子[db..find().sort({KEY:1})]。
文档之间的关系
一对一(one to one)
//一对一
db.wifeAndHusband.insert([
{
name:"黄蓉",
husband:{
name:"郭靖"
}
},
{
name:"武大郎",
husband:{
name:"潘金莲"
}
}
]);
db.wifeAndHusband.find();
一对多(one to many)|多对一(many to one)
//一对多
db.user.insert([
{
username:"swk"
},
{
username:"zbj"
}
]);
db.order.insert([
{
list:["牛肉","猪肉"],
user_id:ObjectId("5c637b1d53a38b878a62f2f3")
},
{
list:["桃子","橘子"],
user_id:ObjectId("5c637b1d53a38b878a62f2f2")
}
]);
db.user.find({});
db.order.find({});
//查找用户为zbj的订单
var user_id = db.user.findOne({username:"zbj"})._id;
db.order.find({user_id:user_id});
db.user.remove({});
db.order.remove({});
多对多(many to many)
//多对多
db.teachers.insert([
{name:"洪七公"},
{name:"黄药师"},
{name:"龟仙人"}
]);
db.stus.insert([
{
name:"郭靖",
tech_ids:[
ObjectId("5c6381b653a38b878a62f2f8"),
ObjectId("5c6381b653a38b878a62f2fa")
]
},
{
name:"刘德华",
tech_ids:[
ObjectId("5c6381b653a38b878a62f2f9"),
ObjectId("5c6381b653a38b878a62f2fa")
]
}
]);
db.teachers.find();
db.stus.remove({});