MongoDB笔记
安装
Windows
官网下载MongoDB Community Download
可安装 MongoDB Compass 的数据库管理工具
打开 bin/mongo.exe 即可连接 MongoDB
Linux
推荐直接宝塔面板,然后在软件商店点击安装 MongoDB 即可
Docker
docker pull mongo:latest
mkdir /home/mongo/ # 创建本地数据库文件夹
docker run -itd --name mongo --restart=always --privileged -p 27017:27017 -v /home/mongo/data:/data/db -v /home/mongo/conf:/data/configdb -v /home/mongo/logs:/data/log/ mongo:latest --config /data/configdb/mongod.conf --bind_ip_all
# -v 指定配置文件启动
# --bind_ip_all 允许所有IP访问
# ----restart=always Docker服务重启容器也启动
# --privileged 拥有真正的root权限
docker exec -it mongo bash
# 进入容器
root@71351dc5b914:/# mongo
# 进入 mongo
# 后文有
配置远程连接
首先按照上面步骤创建用户,后续都是以这个用户来进行连接数据库
找到配置文件
windows \bin\mongod.cfg
linux /etc/mongo/mongod.conf
bind_ip = 0.0.0.0
security:
authorization:enabled
# 注意 两个空
注意: mongodb Compass 有可能会连接不上提示Authentication failed,但使用代码即可。
配置文件如下
# 数据库文件存储位置
dbpath = /data/db/
# log文件存储位置
logpath = /data/log/mongodb/master/mongodb.log
# 使用追加的方式写日志
logappend = true
# 是否以守护进程方式运行
# fork = true
# 端口号
port = 27017
# 是否启用认证
auth = true
# 设置oplog的大小(MB)
oplogSize=2048
-
开启防火墙 systemctl start firewall
-
防火墙放端口
firewall-cmd --zone=public --add-port=27010/tcp --permanent
-
重启防火墙
firewall-cmd --reload
基本命令
# 创建数据库
use 数据库名
show databases
show users
增删改查
原生的 mongodb CRUD 命令没啥好说的,Nodejs 主要配合 Mongoose 来使用,这边就直接不列举了
索引
// 创建索引
db.user.ensureIndex({"username":1},{"name":"usernameIndex"}) // 1是升序 一般用降序 可查最新的账号 第二个参数可指定索引名称
// 获取索引
db.user.getIndexes()
// 删除索引
db.user.dropIndex({"username":1})
// 唯一索引
db.user.ensureIndex({"userId":1},{"unique",true})
// 再次插入userId重复的文档 mongodb将会报错 提示插入重复键 同时有重复文档也无法创建唯一索引
账户权限配置管理
1.创建用户
use admin
# root 超级管理员
db.createUser({ user:'admin', pwd:'123456',roles:[ { role:'root', db: 'admin'} ] });
db.auth('admin', '123456')
# 创建有可读写权限的用户. 对于一个特定的数据库, 比如 my,添加用户 user1,角色:dbOwner
db.createUser({user:"user1",pwd:"pwd",roles:[{role:"dbOwner",db:"my"}]})
一些角色权限 命令
角色命令
show users // 查看当前数据库下角色
db.updateUser("admin",pwd:"password")
db.auth("admin","password")
// 或者 直接通过Url 来连接
const url = 'mongodb://admin:a123456.@localhost:27027/';
聚合管道
// $projext 限制字段
db.order.aggregate([
{$projext:{no:1,all_price:1}}
])
// $match 过滤文档 类似于find 方法中的参数
db.order.aggregate([
{$projext:{no:1,all_price:1}},
{$match:{"all_price":{$get:90}}
])
// $group 分组
db.order.aggregate([
{
$group:{_id:"$order_id",total:{$sum: "$price"}}
},
])
// 可加 $sort $skip
// $lookup 表关联
db.order.aggregate([
{
$lookup:{
from:'order_item',
localField:"order_id",
foreignField:"order_id",
as:"items"
}
},
])
Mongoose
连接
const mongoose = require('mongoose')
let url = 'mongodb://localhost:27017/xujianlei'
mongoose.connect(url, { useNewUrlParser: true }, function (err) {})
定义 Schema
import * as mongoose from 'mongoose'
let UserSchema = mongoose.Schema({
username: {
type: String,
trim: true,
unique: true, // 唯一索引 index:true 是普通索引
},
password: String,
age: {
type: Number,
get(params) {
return params + '岁'
}, // get不建议使用 因为不是获取的时候添加 而是实例化的时候取的时候添加
},
status: Number,
headImg: {
type: String,
set(params) {
if (!params.includes('https://') || !params.includes('http://')) {
return 'http://' + params
}
return params
},
},
})