MongoDB
1. 关系型数据库和非关系型数据库
- 关系型数据库:表与表之间存在关系
- 所有的关系型数据库都需要通过
sql
语言来操作 - 所有的关系型数据库在操作之前都要设计表结构
- 数据表支持约束
- 唯一
- 主键
- 默认值
- 非空
- 所有的关系型数据库都需要通过
- 非关系型数据库:
- 有一些非关系型数据库就是 key-value 键值对
- 非常灵活
2. MongoDB 介绍
菜鸟教程:https://www.runoob.com/nodejs/nodejs-mongodb.html
sql | mongo | 说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合(就是 js 数组) |
row | document | 数据记录行/文档 |
column | filed | 字段/域 |
index | index | 索引 |
table joins | 表连接,mongo 不支持 | |
primary key | primary key | 主键,mongo 自动将 _id 设置为主键 |
- 和关系型数据库很像
- 不需要设计表结构
- 可以任意往里面存数据,没有结构性限制
基本结构
- 数据库
- 集合
- 文档
- 集合
{
// 每一个数据库就是一个对象
qq: {
// 每一个集合就是一个存储数据的数组,相当于表
users: [
// 每一条数据都是一个对象,称之为文档,相当于表记录
{name: '张三1', age: 18},
{name: '张三2', age: 19},
{name: '张三3', age: 20},
{name: '张三4', age: 21}
...
],
products: [
]
...
}
taobao: {
}
}
3. 在 Mac 上安装 MongoDB
# 进入 /usr/local
cd /usr/local
# 下载
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.9.tgz
# 解压
sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.9.tgz
# 重命名为 mongodb 目录
sudo mv mongodb-osx-x86_64-4.0.9/ mongodb
# 安装完成后把二进制文件添加到PATH路径中
export PATH=/usr/local/mongodb/bin:$PATH
# 检查是否安装成功
mongod --version
附:mac 上配置环境变量
/etc/profile
(建议不修改这个文件)全局(公有)配置,不管哪个用户,登录时都会读取该文件。
/etc/bashrc
(一般在这个文件中添加系统级环境变量)
~/.bash_profile
(一般在这个文件中添加用户级环境变量)
查看已经配置的PATH
echo $PATH
配置:
# 进入当前用户根目录
cd ~/
# 创建
touch .bash_profile
# 用文本编辑器打开
open -e .bash_profile
# 立即生效
source .bash_profile
在.bash_profile
中的内容:
# MongoDB
MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
# 如果要配置多个,直接在下面添加即可
4. 使用 MongoDB
启动和关闭数据库
启动:
# mongodb 默认使用执行 mongod 命令所处的盘符下的 /data/db 作为数据存储目录
# 第一次必须手动创建一个
# Mac 必须要更改权限才能启动
sudo mongod
如果想要更改默认的数据存储路径,可以:
mongod --dbpath=路径
停止:Ctrl + C
连接和退出数据库
# 该命令默认连接本机 MongoDB 服务
mongo
# 退出
exit
基本命令
show dbs
查看所有数据库db
查看当前操作的数据库use 数据库名称
切换到指定的数据(如果没有就新建)show collections
查看当前数据库集合db.collection.find()
查询集合中的数据
5. mongoose
官网 http://www.mongoosejs.net/
起步
const mongoose = require('mongoose');
// 连接的数据库不需要存在,当你创建第一条记录的时候会自动被创建出来
mongoose.connect('mongodb://localhost/test');
const Cat = mongoose.model('Cat', { name: String });
const kitty = new Cat({ name: 'Zildjian' });
kitty.save().then(() => console.log('meow'));
设计 Schema,发布 model
- 连接数据库
mongoose.connect('mongodb://localhost/test')
-
设计文档结构
-
每一个字段对应 Schema 对象里面的一个属性,可以对属性添加约束,约束的目的就是保证数据的一致性
-
每一个 schema 都会映射到一个 MongoDB collection ,并定义这个 collection 里的文档的构成。
-
var Schema = mongoose.Schema
var userSchema = new Schema({
username: {
type: String, // 类型
require: true // 是否必须
},
password: {
type: String,
require: true
},
email: {
type: String
}
})
- 将文档结构发布为模型(mongoose.model 方法就是将一个架构(Schema)发布为 model)
- 第一个参数:传入一个大写名词单数字符串来表示你的数据库名称,Mongoose 会自动生成 model 名字复数形式的 collection
- User --> users
- 第二个参数:架构
- 第一个参数:传入一个大写名词单数字符串来表示你的数据库名称,Mongoose 会自动生成 model 名字复数形式的 collection
var User = mongoose.model('User', userSchema);
- 当我们有了模型构造函数之后,就可以操作 users 中的数据了
5.1 增加数据
var user = new User({
username: 'admin',
password: '123',
email: 'admin@qq.com'
})
// 保存到数据库中
user.save(function (err, result) {
if (err) {
console.log('保存失败')
return
}
console.log('保存成功')
console.log(result)
})
5.2 查询数据
- 查询所有数据
User.find(function (err, result) {
if (err) {
console.log('查询失败');
return;
}
console.log('查询成功');
console.log(result);
})
- 按条件查询
User.find({
// 查找 username 为 admin 的数据
username: 'admin'
}, function (err, result) {
//...
})
- 按条件查询单个数据
User.findOne({
// 查找 username 为 admin 的数据
username: 'admin'
}, function (err, result) {
//...
})
find
查询出来的数据存放在数组里面,哪怕只有一条数据
findOne
只查询匹配的第一条数据,返回的是一个对象
5.3 删除和更新数据
/**
* 删除数据
*/
User.remove(function (err, result) {
if (err) return handleError(err);
// removed! 这是删除所有
console.log('删除成功')
});
/**
* 更新数据
*/
User.findByIdAndUpdate('5d84932162fa221093ca2a90', {
username: 'test'
}, function (err, result) {
if (err) {
console.log('更新失败');
return;
}
console.log('更新成功');
console.log(result);
})
这些方法官方已经不推荐使用,具体用的时候看文档https://mongoosejs.com/docs/api.html