3.数据库是什么
数据库(DataBase)是按照数据结构来组织、存储和管理数据的仓库。
4.数据库的分类
1) 关系型数据库(RDBS)
代表有:MySQL、Oracle、DB2、SQL Server...
特点:关系紧密,都是表
2) 非关系型数据库(NoSQL)
代表有:MongoDB、Redis...
特点:关系不紧密,有文档,有键值对
5.安装MongoDB
1) 安装 https://www.mongodb.org/dl/win32/
2) 配置环境变量
C:\Program Files\MongoDB\Server\3.2\bin
3) 在c盘根目录
- 创建一个文件夹 data
- 在data中创建一个文件夹db
4) 打开cmd命令行窗口
- 输入 mongod 启动mongodb服务器
- 32位注意
启动服务器时,需要输入如下内容(首次输入即可,首次不用输入mongod,后面直接输入mongod即可)
mongod --storageEngine=mmapv1
- 自定义数据库存放路径(可选)
mongod --dbpath 数据库路径(db路径) --port 端口号
配置数据库放置路径,端口号建议采用默认的,如果自己设置大于四位数小于65535
5) 在打开一个cmd窗口
- 输入 mongo 连接mongodb ,出现 >
- 数据库(database)
- 数据库的服务器
- 服务器用来保存数据
- mongod 用来启动服务器
- 数据库的客户端
- 客户端用来操作服务器,对数据进行增删改查的操作
- mongo 用来启动客户端
6.将MongoDB设置为系统服务,可以自动在后台启动,不需要每次都手动启动
1.在c盘根目录创建data
- 在data下创建db和log文件夹
2.创建配置文件
在目录 C:\Program Files\MongoDB\Server\3.2 下添加一个配置文件mongod.cfg
配置文件内容:
systemLog:
destination: file
path: C:\data\log\mongod.log
storage:
dbPath: C:\data\db
3.以管理员的身份打开命令行窗口
4.执行如下的命令
sc.exe create MongoDB binPath= "\"C:\Program Files\MongoDB\Server\3.2\bin\mongod.exe\" --service --config=\"C:\Program Files\MongoDB\Server\3.2\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
sc.exe create MongoDB binPath= "\" mongod的bin目录 \mongod.exe\" --service --config=\" mongo的安装目录(bin上面一层) \mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
5.任务管理器启动mongodb服务
6.如果启动失败,证明上边的操作有误,
在控制台输入 sc delete MongoDB 删除之前配置的服务
然后从第一步再来一次
7.MongoDB基本指令
1)show dbs
show databases
- 显示所有的数据库
2)use 数据库名
- 进入到指定的数据库中
3)db
- db表示的是当前所处的数据库
4)show collections
- 显示数据库中所有的集合
!! 在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合
1.数据库的CRUD(增删改查)的操作
1)增:
db.集合名.insert(doc)
- 向集合中插入一个文档(一般为对象,或数组)
- 例子:向test数据库中的,stus集合中插入一个新的学生对象
db.stus.insert({name:"孙悟空",age:18,gender:"男"})
db.stus.insert([{name:"孙悟空",age:18,gender:"男"},{}])
db.collection.insertOne()
- 插入一个文档对象
db.collection.insertMany()
- 插入多个文档对象
2)删:
db.collection.remove(查询条件)
- 删除一个或多个,第二个参数传递一个true,则只会删除一个,默认false,删除多个
db.collection.remove({name:"王强"},true)
db.collection.remove({name:"王强"})
- 如果传递一个空对象作为参数,则会删除所有的,不传不行
db.collection.remove({})
db.collection.drop() 删除集合
db.dropDatabase() 删除数据库
db.collection.deleteOne({name:"王强"}):删除第一个
db.collection.deleteMany({name:"王强"}):删除多个
- 一般数据库中的数据都不会删除,所以删除的方法很少调用
一般会在数据中添加一个字段,来表示数据是否被删除 {isDel:0}没有删除 {isDel:1}删除
3) 改:
db.collection.update(查询条件,新对象)
1. update()默认情况下会使用新对象来替换旧的对象
db.stus.update({name:"沙和尚"},{age:28})
2. 如果需要修改指定的属性,而不是替换需要使用“修改操作符”来完成修改
$set 可以用来修改文档中的指定属性
$unset 可以用来删除文档的指定属性
$push 用于向数组中添加一个新的元素
$addToSet 向数组中添加一个新元素 , 如果数组中已经存在了该元素,则不会添加
$inc 自增,在原来的值上面增加一个数值
update()默认只会修改一个
一个对象设置属性:
db.stus.update(
{"_id" : ObjectId("59c219689410bc1dbecc0709")},
{$set:{
gender:"男",
address:"流沙河"
}}
)
一个对象删除属性:
db.stus.update(
{"_id" : ObjectId("59c219689410bc1dbecc0709")},
{$unset:{
address:1
}}
)
多个对象设置:
db.stus.update(
{"name" : "猪八戒"},
{
$set:{
address:"呵呵呵"
}
} ,
{
multi:true
}
)
3. db.collection.replaceOne(查询条件,新对象):替换一个文档
db.stus.replaceOne({name:"沙和尚"},{age:28}) -
db.collection.updateOne(查询条件,新对象):修改一个符合条件的文档
db.stus.updateOne(
{"_id" : ObjectId("59c219689410bc1dbecc0709")},
{$set:{
gender:"男",
address:"流沙河"
}}
) -
db.collection.updateMany(查询条件,新对象):同时修改多个符合条件的文档
db.stus.updateMany(
{"_id" : ObjectId("59c219689410bc1dbecc0709")},
{$set:{
gender:"男",
address:"流沙河"
}}
)
4)查:
db.集合名.find()
- 查询当前集合中符合条件的的所有的文档
db.集合名.find()/db.集合名.find({}):查询当前集合中的所有的文档,返回一个数组
db.集合名.find({属性:值}):查询当前集合中符合条件的所有文档,返回一个数组
db.集合名.findOne({属性:值}):查询当前集合中符合条件的的第一个文档,返回一个对象
db.users.find({'hobby.movies':"hero"});如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号
这句话的意思是: 查询hobby属性的movies属性值中包含hero元素的文档
db.emp.find({},{ename:1 , _id:0 , sal:1}):在查询时,可以在第二个参数的位置来设置查询结果的 投影 1代表显示 0代表不显示
查询操作符:
//18.查询numbers中num值有500的文档
db.numbers.find({num:500})
//19.查询numbers中num大于5000的文档
db.numbers.find({num:{$gt:500}});大于
db.numbers.find({num:{$eq:500}});等于
db.numbers.find({num:{$gte:500}});大于等于
//20.查询numbers中num小于30的文档
db.numbers.find({num:{$lt:30}});小于
db.numbers.find({num:{$lte:30}});小于等于
//21.查询numbers中num大于40小于50的文档
db.numbers.find({num:{$gt:40 , $lt:50}});
//21.查询工资小于1000或大于2500的员工
db.emp.find({$or:[{sal:{$lt:1000}} , {sal:{$gt:2500}}]});
//22.查看numbers集合中的前10条数据
db.numbers.find().limit(10);
//23.查看numbers集合中的第11条到20条数据
db.numbers.find().skip(10).limit(10);
skip((页码-1) * 每页显示的条数).limit(每页显示的条数);
MongoDB会自动调整skip和limit的位置
5)其他方法:
db.集合名.find()/db.集合名.find({}).count():查询文档个数
db.numbers.find().skip(10).limit(10):skip()用于跳过指定数量的数据,limit()设置显示数据的上限,MongoDB会自动调整skip和limit的位置,skip永远在前
db.emp.find({}).sort({sal:1,empno:-1}):可以用来指定文档的排序的规则,sort()需要传递一个对象来指定排序规则 1表示升序 -1表示降序(先sal,后empno)
2.文档之间的关系
一对一(one to one)
- 夫妻 (一个丈夫 对应 一个妻子)
- 在MongoDB,可以通过内嵌文档的形式来体现出一对一的关系
一对多(one to many)/多对一(many to one)
- 父母 - 孩子
用户 - 订单
文章 - 评论
- 也可以通过内嵌文档来映射一对多的关系
- 或通过_id属性值或其他属性让多个集合建立联系
多对多(many to many)
- 分类 - 商品
老师 - 学生
通过_id属性值或其他属性让多个集合建立联系
3.使用mongoose模块操作数据库
1.下载安装Mongoose
npm i mongoose --save
2.在项目中引入mongoose
var mongoose = require("mongoose");
3.连接MongoDB数据库
mongoose.connect('mongodb://localhost(数据库的ip地址):端口号/mongoose_test(数据库名)', { useMongoClient: true})
- 如果端口号是默认端口号(27017) 则可以省略不写 链接mongo客户端,可以省略
4.断开数据库连接(一般不需要调用)
mongoose.disconnect()
- 监听MongoDB数据库的连接状态
- 在mongoose对象中,有一个属性叫做connection,该对象表示的就是数据库连接
通过监视该对象的状态,可以来监听数据库的连接与断开
数据库连接成功的事件
mongoose.connection.once("open",function(){});
数据库断开的事件
mongoose.connection.once("close",function(){});
Schema 模式/约束对象
Model 模型对象(相当于数据库集合)
Document (相当于数据库文档)
var mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1/mongoose_test",{useMongoClient:true});
//将mongoose.Schema 赋值给一个变量
var Schema = mongoose.Schema;
//创建Schema(模式)对象
var stuSchema = new Schema({
name:String,
gender:{
type:String,//类型
default:"female"//默认值
},
});
//mongoose.model(modelName, schema):
//modelName 就是要映射的集合名 mongoose会自动将集合名变成复数 通过schema来约束Model
var StuModel = mongoose.model("student" , stuSchema);
//向数据库中插入一个文档
//StuModel.create({}, function(err){});
4.Model方法
1.增
Model.create(doc(s), [callback])
- 用来创建一个或多个文档并添加到数据库中
- 参数:
doc(s) 可以是一个文档对象,也可以是一个文档对象的数组
callback 当操作完成以后调用的回调函数
参数1:err
参数2:插入的文档,数组形式
2.删
Model.remove(conditions, [callback])
Model.deleteOne(conditions, [callback])
Model.deleteMany(conditions, [callback])
conditions:条件
callback:回调函数 参数1 err
3.改
Model.update(conditions, doc, [options], [callback]) 默认修改一个
Model.updateMany(conditions, doc, [options], [callback])
Model.updateOne(conditions, doc, [options], [callback])
- 用来修改一个或多个文档
- 参数:
conditions 查询条件
doc 修改后的对象 {$set:{age:20}}
options 配置参数 {multi:true}修改多个 {multi:false}修改一个,默认修改一个
callback 回调函数 参数1 err
Model.replaceOne(conditions, doc, [options], [callback])
4.查
Model.find(conditions, [projection], [options], [callback])
- 查询所有符合条件的文档 总会返回一个数组
Model.findById(id, [projection], [options], [callback])
- 根据文档的id属性查询文档
Model.findOne([conditions], [projection], [options], [callback])
- 查询符合条件的第一个文档 总和返回一个具体的文档对象
conditions 查询的条件 {}传空对象表示查询全部
projection 投影 需要获取到的字段
- 两种方式
{name:1,_id:0} 1显示 0不显示
"name -_id" 加负号不显示
options 查询选项(skip limit)
{skip:3 , limit:1}
callback 回调函数,查询结果会通过回调函数返回
回调函数必须传,如果不传回调函数,压根不会查询
Model.count(conditions, [callback])//目前以废弃
Model.countDocuments(conditions, [callback])
- 统计文档的数量的
conditions:条件
callback:回调函数 参数1 err 参数2 count满足条件的文档个数
5.Document
Document 和 集合中的文档一一对应 , Document是Model的实例,通过Model查询到结果都是Document
1)创建一个Document
var stu = new StuModel({name:"奔波霸",});
2)stu.save(function (err) {}):添加对象,只有调用这个方法数据库里的文档数据才能发生改变
3)doc.update({$set:{age:28}},function (err) {}):修改对象
4)doc.remove(function (err) {}):删除对象
5) doc.get(name)
- 获取文档中的指定属性值
doc.set(name , value)
- 设置文档的指定的属性值
doc.id
- 获取文档的_id属性值
doc.toJSON() 有问题
- 转换为一个JSON对象
doc.toObject()
- 将Document对象转换为一个普通的JS对象
转换为普通的js对象以后,注意所有的Document对象的方法或属性都不能使用了
-