MongoDB
关系型和非关系型数据库
关系型数据库(表就是关系,或者说表与表之间存在关系)。
- 所有的关系型数据库都需要通过
sql
语言来操作 - 所有的关系型数据库在操作之前都需要设计表结构
- 而且数据表还支持约束
- 唯一的
- 主键
- 默认值
- 非空
非关系型数据库
- 非关系型数据库非常的灵活
- 有的关系型数据库就是key-value对儿
- 但MongDB是长得最像关系型数据库的非关系型数据库
- 数据库 -》 数据库
- 数据表 -》 集合(数组)
- 表记录 -》文档对象
一个数据库中可以有多个数据库,一个数据库中可以有多个集合(数组),一个集合中可以有多个文档(表记录)
{qq:{user:[{},{},{}...]}
}
- 也就是说你可以任意的往里面存数据,没有结构性这么一说
安装
-
下载
- 下载地址:https://www.mongodb.com/download-center/community
- 下载地址:https://www.mongodb.com/download-center/community
-
安装
一直Next即可。。。
这是安装MongoDB的服务。这是4之后的版本有的,这里安装了以后,就不用配置dbpath和logpath,也不用配置服务了。安装完了,就直接可以使用MongoDB。
npm i mongoose
- 配置环境变量
- 找到安装好的MongoDB文件夹下的bin目录
- 最后输入
mongod --version
测试是否安装成功
启动和关闭数据库
启动:
# mongodb 默认使用执行mongod 命令所处盼复根目录下的/data/db作为自己的数据存储目录
# 所以在第一次执行该命令之前先自己手动新建一个 /data/db
mongod
如果想要修改默认的数据存储目录,可以:
mongod --dbpath = 数据存储目录路径
注意:mongodb 4版本以上,不需要再手动区启动服务,默认已经自动启动了
停止:
在开启服务的控制台,直接Ctrl+C;
或者直接关闭开启服务的控制台。
连接数据库
连接:
# 该命令默认连接本机的 MongoDB 服务
mongo
退出:
# 在连接状态输入 exit 退出连接
exit
基本命令
-
show dbs
- 查看数据库列表(数据库中的所有数据库)
-
db
- 查看当前连接的数据库
- 查看当前连接的数据库
-
use 数据库名称
- 切换到指定的数据库,(如果没有会新建)
- 切换到指定的数据库,(如果没有会新建)
-
show collections
- 查看当前目录下的所有数据表
- 查看当前目录下的所有数据表
-
db.表名.find()
- 查看表中的详细信息
- 查看表中的详细信息
二、在Node中如何操作MongoDB数据库
使用官方的MongoDB
包来操作
http://mongodb.github.io/node-mongodb-native/
https://www.npmjs.com/package/mongodb
使用第三方包mongoose
来操作MongoDB数据库(推荐)
第三方包:mongoose
基于MongoDB官方的mongodb
包再一次做了封装,名字叫mongoose
,是WordPress项目团队开发的。
https://mongoosejs.com/
mongoose的第一个demo
新建一个项目文件夹:mongoose-demo,然后cmd 执行 npm init -y
:
执行npm install mongoose
:
demo1.js:
// 1. 引入包
const mongoose = require('mongoose');// 2. 连接MongoDB 数据库
mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true,useUnifiedTopology: true
});// 3. 创建一个模型
// 就是在设计数据库
// MongoDB是动态的,非常灵活,只需要在代码中设计你的数据库就可以了
// mongoose 这个包就可以让你的设计编写过程变得非常的简单
const Cat = mongoose.model('Cat', {name: String
});// 4. 实例化一个Cat
const kitty = new Cat({name: 'Zildjian'
});// 5. 持久化保存kitty实例
kitty.save().then(() => console.log('meow'));
mongoose:
官网:http:/mongoosejs.com/
官方指南:http:/mongoosejs.com/docs/guide.html
官方API文档:http:/mongooseis.com/docs/api.html
mongoose基本使用:
1. 设计Schema发布Model:
// 1.导包
const mongoose = require('mongoose')const Schema = mongoose.Schema// 2.连接数据库
// 这里指定连接的数据库mydb可以不需要存在,当你插入第一条数据之后就会帮你自动创建这个数据库
mongoose.connect('mongodb://localhost/mydb')// 3.设计集合结构(表结构)
// 字段名称就是表结构中的属性名称
// 值
const userSchema = new Schema({username: {type: String,require: true // 必须有该属性},password: {type: String,require: true},email: {type: String}
});// 3.将文档结构发布为模型
// mongoose.model() 就是用来将一个架构发布为 model
// 第一个参数: 传入一个大写名词单数字符串,用来表示你的数据库名称
// mongoose会自动将大写名词的字符串生成小写复数的集合名称
// 例如:这里的User最终会变为users集合名称
// 第二个参数: 架构Schema
// 返回值: 模型构造函数
var User = mongoose.model('User',userSchema)// 4.当我们有了模型构造函数之后,就可以使用这个构造函数对users集合中的数据进行操作
2. 增加数据
// 1.导包
const mongoose = require('mongoose')const Schema = mongoose.Schema// 2.连接数据库
// 这里指定连接的数据库mydb可以不需要存在,当你插入第一条数据之后就会帮你自动创建这个数据库
mongoose.connect('mongodb://localhost/mydb')// 3.设计集合结构(表结构)
// 字段名称就是表结构中的属性名称
// 值
const userSchema = new Schema({username: {type: String,require: true // 必须有该属性},password: {type: String,require: true},email: {type: String}
});// 3.将文档结构发布为模型
// mongoose.model() 就是用来将一个架构发布为 model
// 第一个参数: 传入一个大写名词单数字符串,用来表示你的数据库名称
// mongoose会自动将大写名词的字符串生成小写复数的集合名称
// 例如:这里的User最终会变为users集合名称
// 第二个参数: 架构Schema
// 返回值: 模型构造函数
var User = mongoose.model('User',userSchema)// 4.当我们有了模型构造函数之后,就可以使用这个构造函数对users集合中的数据进行操作
var admin = new User({username: 'admin',password: '123456',email: 'admin@admin.com'
})admin.save(function(err, ret) {if(err) {console.log('保存失败')} else {console.log('保存成功!')console.log(ret)}
})
3. 查询数据
// 1.导包
const mongoose = require('mongoose')const Schema = mongoose.Schema// 2.连接数据库
// 这里指定连接的数据库mydb可以不需要存在,当你插入第一条数据之后就会帮你自动创建这个数据库
mongoose.connect('mongodb://localhost/mydb')// 3.设计集合结构(表结构)
// 字段名称就是表结构中的属性名称
// 值
const userSchema = new Schema({username: {type: String,require: true // 必须有该属性},password: {type: String,require: true},email: {type: String}
});// 3.将文档结构发布为模型
// mongoose.model() 就是用来将一个架构发布为 model
// 第一个参数: 传入一个大写名词单数字符串,用来表示你的数据库名称
// mongoose会自动将大写名词的字符串生成小写复数的集合名称
// 例如:这里的User最终会变为users集合名称
// 第二个参数: 架构Schema
// 返回值: 模型构造函数
var User = mongoose.model('User', userSchema)// 4.当我们有了模型构造函数之后,就可以使用这个构造函数对users集合中的数据进行操作
// 新增数据操作
/* var admin = new User({username: 'zepzep',password: '000000',email: 'zep@zep.com'
})admin.save(function(err, ret) {if(err) {console.log('保存失败')} else {console.log('保存成功!')console.log(ret)}
}) */// 查询数据操作
// 1.查询所有数据
/* User.find(function(err, ret) {if(err) {console.log('查询失败')} else {console.log(ret)}
}) */// 2.按条件查询数据,返回值为数组
/* User.find({username: 'zepzep'
}, function(err, ret) {if (err) {console.log('查询失败')} else {console.log(ret)}
})*/// 3.按条件查询数据,返回值为查找到的匹配的第一个的对象
User.findOne({username: 'zepzep',password: '111'
}, function(err, ret) {if (err) {console.log('查询失败')} else {console.log(ret)}
})
4. 删除数据
// 1.导包
const mongoose = require('mongoose')const Schema = mongoose.Schema// 2.连接数据库
// 这里指定连接的数据库mydb可以不需要存在,当你插入第一条数据之后就会帮你自动创建这个数据库
mongoose.connect('mongodb://localhost/mydb')// 3.设计集合结构(表结构)
// 字段名称就是表结构中的属性名称
// 值
const userSchema = new Schema({username: {type: String,require: true // 必须有该属性},password: {type: String,require: true},email: {type: String}
});// 3.将文档结构发布为模型
// mongoose.model() 就是用来将一个架构发布为 model
// 第一个参数: 传入一个大写名词单数字符串,用来表示你的数据库名称
// mongoose会自动将大写名词的字符串生成小写复数的集合名称
// 例如:这里的User最终会变为users集合名称
// 第二个参数: 架构Schema
// 返回值: 模型构造函数
var User = mongoose.model('User', userSchema)// 4.当我们有了模型构造函数之后,就可以使用这个构造函数对users集合中的数据进行操作
// 新增数据操作
/* var admin = new User({username: 'zepzep',password: '000000',email: 'zep@zep.com'
})admin.save(function(err, ret) {if(err) {console.log('保存失败')} else {console.log('保存成功!')console.log(ret)}
}) */// 查询数据操作
// 1.查询所有数据
/* User.find(function(err, ret) {if(err) {console.log('查询失败')} else {console.log(ret)}
}) */// 2.按条件查询数据,返回值为数组
/* User.find({username: 'zepzep'
}, function(err, ret) {if (err) {console.log('查询失败')} else {console.log(ret)}
})*/// 3.按条件查询数据,返回值为查找到的匹配的第一个的对象
/* User.findOne({username: 'zepzep',password: '111'
}, function(err, ret) {if (err) {console.log('查询失败')} else {console.log(ret)}
}) */// 删除数据操作
User.remove({username: 'zepzep'
}, function(err, ret) {if(err) {console.log('删除失败')} else {console.log('删除成功!')console.log(ret)}
})
5.更新数据
// 1.导包
const mongoose = require('mongoose')const Schema = mongoose.Schema// 2.连接数据库
// 这里指定连接的数据库mydb可以不需要存在,当你插入第一条数据之后就会帮你自动创建这个数据库
mongoose.connect('mongodb://localhost/mydb')// 3.设计集合结构(表结构)
// 字段名称就是表结构中的属性名称
// 值
const userSchema = new Schema({username: {type: String,require: true // 必须有该属性},password: {type: String,require: true},email: {type: String}
});// 3.将文档结构发布为模型
// mongoose.model() 就是用来将一个架构发布为 model
// 第一个参数: 传入一个大写名词单数字符串,用来表示你的数据库名称
// mongoose会自动将大写名词的字符串生成小写复数的集合名称
// 例如:这里的User最终会变为users集合名称
// 第二个参数: 架构Schema
// 返回值: 模型构造函数
var User = mongoose.model('User', userSchema)// 4.当我们有了模型构造函数之后,就可以使用这个构造函数对users集合中的数据进行操作
// 新增数据操作
/* var admin = new User({username: 'zepzep',password: '000000',email: 'zep@zep.com'
})admin.save(function(err, ret) {if(err) {console.log('保存失败')} else {console.log('保存成功!')console.log(ret)}
}) */// 查询数据操作
// 1.查询所有数据
/* User.find(function(err, ret) {if(err) {console.log('查询失败')} else {console.log(ret)}
}) */// 2.按条件查询数据,返回值为数组
/* User.find({username: 'zepzep'
}, function(err, ret) {if (err) {console.log('查询失败')} else {console.log(ret)}
})*/// 3.按条件查询数据,返回值为查找到的匹配的第一个的对象
/* User.findOne({username: 'zepzep',password: '111'
}, function(err, ret) {if (err) {console.log('查询失败')} else {console.log(ret)}
}) */// 删除数据操作
/* User.remove({username: 'zepzep'
}, function(err, ret) {if(err) {console.log('删除失败')} else {console.log('删除成功!')console.log(ret)}
}) */// 更新数据操作
User.findByIdAndUpdate('6062cff077b662686460e549', {password: '123'
}, function(err, ret) {if(err) {console.log('更新失败')} else {console.log('更新成功!')console.log(ret)}
})