在学习某个数据库之前,可以根据学习其他数据库的经验来问出数据库共有的问题,带着这些问题去学习一个新的数据库,有助于我们更快地学习。当然没学过数据库,也可以根据这些问题对数据库有整体的了解,从而在具体学习过程中更游刃有余。而且在学习完一段时间之后,有了这些问题能让你在一段时间之后,感觉学过却又什么记不起来时,顺着这些思路,快速捡起忘记的知识点。
数据库:database,存储数据的仓库
数据库:高效的存储和处理数据的介质(说白了就是把数据存在哪里,是磁盘呢还是内存呢)
可以按数据库的存储介质不同,来分类:存储在磁盘的是关系型数据库(SQL),存储在内存的是菲关系型数据库(NoSQL)
关系型数据库
大型:Oracle,DB2
中型:SQL-SERVER ,Mysql等
小型:Acess等
非关系型数据库:memcached,mongodb,redis等
从分类中你已经知道,这两种数据库阵营的存储介质不同,关系型数据库存在磁盘中,菲关系型数据库存储在内存中。那存再磁盘和存在内存中有什么优缺点呢?很明显在学习计算机基础知识的时候,我们就知道存储在磁盘中的数据,即使断电关机了,也不会丢失,下次开机还是会找得到数据,而存储在内存中,数据是运行时产生的,一旦断电关机运行停止,数据也就消失了。但cpu向内存读取或写入的速度是高于磁盘的。还有就是关系型数据库是以行列(也就是二维表)形式存储在磁盘的,即使某li列为空也是占有空间的,所以比较浪费空间,而菲关系型数据库不存在这一点问题。
将上述分析的点总结一下就是:
关系型数据库:安全(保存在磁盘不易丢失),容易理解,比较浪费空间(二维表)
非关系型数据库:不安全(断电丢失),效率高(读写速度快)
非关系型数据库
可以有多个数据库,一个数据库中可以有多个集合(表),一个集合中又可以有多个文档(表记录),文档结构很灵活,没有任何限制。
MongoDB数据库非常灵活,不像Mysql数据库那样先创建数据库、表、设计表结构,只需要在插入数据的时候,指定在哪个数据库的哪个集合里操作就可以。而数据库和表都由MongoDB来自动完成。
数据库本身也是一种服务器,因此跟服务器一样,需要启动之后,用户才能进行访问。
mongodb的启动命令是
# mongodb 默认使用执行mongod命令所在盘符的根目录下的/data/db作为自己数据的根目录
# 所以在第一次执行之前需要手动创建/data/db目录
mongod
既然看到有默认目录不是固定,那说明也能进行修改不使用默认的目录
mongod --dbpath=数据存储目录路径
停止mongodb
在开启服务器的控制台,直接Ctrl+c
或者直接关闭开启服务的控制台
连接
# 该命令默认连接本地的mongodb服务
mongo
关闭
# 在连接状态输入exit退出连接
exit
实例:
向col集合插入文档
db.col.insert({
name: "张三",
age: 20
})
查看col集合已经插入的文档
db.col.find()
通过 update() 方法来更新name
db.col.update({'name':'张三'}, {$set:{'name':'王五'}})
删除name为“王五”的文档
db.col.remove({'name':'王五'})
更多命令可以查看官方文档
使用第三方mongoose来操作MongoDB数据库,mongoose是基于MongoDB官方包再一次做了封装。
大概流程:首先得安装,然后就是在node中引入数据库模块,接着需要连接上数据库
首先进行 安装
npm install mongoose
在node中使用
//引入mongoose
var mongoose = require('mongoose')
//连接数据库
mongoose.connect('mongodb://localhost/test', {useNewUrlParser: true})
//查看是否连接成功
var db = mongoose.connection
db.on('error', console.error.bind(console, 'connection error:'))
db.once('open', function () {
// we're connected!
})
//设计结合结构(表结构)
var userSchema = new mongoose.Schema({
username: {
type: String,
required: true
},
password: {
type: String,
required: true
},
email: {
type: String,
required: true
}
})
//将文档结构发布为模型(将结构加到集合中)
mongoose.model()方法就是将一个结构发布为模型
第一个参数:传入一个首字母大写的单数字符串表示集合名称
mongoose 会自动将大写名词的字符串生成 小写复数 的集合名称
例如这里的User会自动变成users集合名称
第二个参数:架构Schema
返回值: 模型构造函数
var User = mongoose.model('User', userSchema)
//有了模型构造函数User,就可以对users集合里的数据进行操作
//增加数据
var admin = new User({
username: 'admin',
password: '123456',
email: '[email protected]'
})
admin.save(function (err, ret) {
if (err) {
console.log('保存失败')
} else {
console.log('保存成功')
console.log(ret)
}
})
//查询所有数据
User.find(function (err, ret) {
if (err) {
console.log("查询失败")
} else {
console.log(ret)
}
})
//根据条件查询
User.find({ username: 'admin'}, function (err, ret) {
if (err) {
console.log("查询失败")
} else {
console.log(ret)
}
})
//查找第一个
User.findOne({
username: 'admin'
}, function (err, ret) {
if (err) {
console.log("查询失败")
} else {
console.log(ret)
}
})
//删除数据
//根据条件删除所有
User.remove({
username: 'admin'
}, function (err, ret) {
if (err) {
console.log("删除失败")
} else {
console.log("删除成功")
}
})
//更新数据
//根据id更新一个
User.findByIdAndUpdate('1', {
password: "123"
}, function (err, ret) {
if (err) {
console.log("更新失败")
} else {
console.log("更新成功")
}
})
更多方法可查看官方文档。