1. 安装
- Mac
brew install mongodb
- Ubuntu
sudo apt-get install mongodb
2.启动和关闭
- 启动
1.服务启动(sudo apt-get install mongodb安装可以)
sudo service mongodb start
2.直接启动(开发阶段使用这种方案启动)
sudo mongod
【注意事项】:
- 数据库文件找到引发的错误 Data directory /data/db not found., terminating
sudo mkdir /data
sudo mkdir /data/db
- 权限不够添加sudo
- 可能虚拟机的硬盘大小太小了,小到mongodb不允许你启动
sudo mongod --smallfiles
- 启动参数:
--dbpath 数据库文件路径 默认/data/db
--port 设置监听端口 默认27017
--bind_ip 允许访问的IP地址
--auth 启动验证模式
--config指定配置文件,把所有的相关配置都放到配置文件中
- 关闭
1.服务关闭
sudo service mongodb stop
2.直接关闭
# 1. ctrl + C
# 2. 登录到mongodb中退出
use admin
db.shutdownServer()
# 3. kill 进程(不推荐使用,特别是线上的数据库)
3 操作基本数据库
利用客户端进行登录
# 服务器启动,
sudo mongod
# 进行客户端登录
mongo
数据库操作
列出数据库
show dbs/databases
创建数据库
use 数据库
// 插入数据即可创建
删除数据库
use 数据库
db.dropDatabase()
数据表操作(table => collection)
- 表显示数据库中的集合列
show collections
- 创建集合
// 1. 插入数据即创建
db.集合名称.insert({"a":"b"})
// 2. 创建集合不创建数据
db.createCollection('mycoll')
- 删除集合
db.集合名称.drop()
- 集合重命名
db.集合名称.renameCollection('新的集合名称')
数据库表中数据操作(collection中数据操作)
- 增
// mongodb内部的脚本是一套 类似于语法 javascript引擎
// 单条数据插入
db.mycoll.insert(
{
"a":5,
"b":"abc",
"c":['q','w','e'],
"d":{
"h":"u"
}
}
)
// 多条数据插入
data = [
{"x":"b"},
{"y":"d"}
]
db.集合名.insertMany(data)
- 改
【注意】,默认更新是整体更新,局部更新使用$set,默认更新只更新一条,如果要批量更新就添加第三个参数{multi:true}
// 整体更新
db.stu.update(
// 更新条件
{
"hometown":"蒙古"
},
// 更新内容
{
"name":"传智播客"
}
)
// 局部更新
db.stu.update(
// 更新条件
{
"hometown":"桃花岛"
},
// 更新内容
{
$set:{
"name":"黑马"
}
}
)
// 批量更新
db.stu.update(
// 更新条件
{
"age":18
},
// 更新内容
{
$set:{
"name":"python16期"
}
},
// 更新方式
{
multi:true
}
)
- 删
// 通过删除条件进行删除
db.stu.remove(
// 删除条件
{
age:18
},
// 删除方式
{
justOne:true
}
)
// 清空数据
db.stu.remove({})
- 保存
按照_id字段进行判定,如果存在就进行更新,如果不存在就插入
db.stu.save(
{
"_id":6,
"a":5,
"b":7
}
)
- 查
查询的基本语法,默认是并级
// 基本查询
db.stu.find(
// 设置查询条件
{
"age":18,
"hometown":"蒙古"
}
)
运算符
- 比较运算符
## 大于$gt,大于等于$gte,小于$lt,小于等于$lte,不等于$ne
db.stu.find(
// 设置查询条件
{
"age":{$gt:18}
}
)
- 逻辑运算符
默认是并,或$or
db.stu.find(
{
$or:[
{"age":18},
{"hometown":"蒙古"}
],
"name":"华筝"
}
)
- 范围运算符
$in,$nin,表示内容的值(不)在列表中的查询出来
db.stu.find(
{
age:{$nin:[18,45]}
}
)
- 支持正则表达式
// 1. /正则内容/ -> js正则表达式写法
db.stu.find(
{
name:/^黄/
}
)
// 2. 通过正则表达式关键词`$regex`
db.stu.find(
{
name:{$regex:"^黄"}
}
)
- 自定义查询条件
db.stu.find(
{
$where: function(){
// 返回 true 或者 false,如果是 true 表示符合条件,如果是false表示不符合条件
// this 表示当前记录对象
if (this.age > 18 && this.age < 40) {
return true
} else {
return false
}
}
}
)
limit 和 skip
- limit 显示记录数
- skip 跳过记录数
【注意】如果skip和limit同时使用,不管谁在前面都是先skip在limit
db.stu.find().limit(1)
db.stu.find().skip(1)
db.stu.find().limit(3).skip(2) == db.stu.find().skip(2).limit(3)
投影
让我们显示需要的字段,只要添加了投影条件就默认字段都不显示,只有设置字段为 1 的才会显示,_id默认都显示,如果想让_id不显示可以设置为0
db.stu.find(
// 查询条件
{},
// 投影-> 显示字段
{
name:1,
"_id":0
}
)
排序
升序设置为 1,降序设置为-1
db.stu.find().sort(
// 排序条件
{
age:-1
}
)
统计个数
// 写法一
db.stu.find({查询条件}).count()
// 写法二
db.stu.count({查询条件})
消除重复
关键词distinct()
db.stu.distinct(
// 去重字段
'hometown',
// 过滤条件
{
age:{$gt:18}
}
)
聚合
查询和聚合搜索数据,查询数据更加关注于查询数据本身,聚合关注于统计数据
基本语法
db.集合名称.aggregate([
{管道名称 : {表达式}},
{管道名称 : {表达式}},
{管道名称 : {表达式}},
...
])
- 管道名称
- $group
- $match
- $project
- $sort
- $limit
- $skip
- $unwind
- 表达式(进行操作)
- $sum 统计数量
- $avg 统计平均年龄
- $min
- $max
-$push可以把某个字段放到列表中,$$ROOT表示整条数据 - …
管道
group管道
把数据进行分组,分别对组进行表达式操作
db.stu.aggregate([
{
$group : {
// 第一参按照哪个字段进行分组 key使用 _id,value编写字段名称必须添加 $
// 如果想让所有数据就为一组可以设置成 null
_id:null,//"$gender",
// 统计表达式
// "来自的地区人数":{$sum:1}
"平均年龄":{$avg:"$age"}
// "获取最小年龄":{$min:"$age"}
// "来自地区":{$push:"$hometown"}
// "数据":{$push:"$$ROOT"}
}
}
]).pretty()
match管道
db.stu.aggregate([
{
// match 表达式和 查询条件写法一模一样
$match: {
age:{$gt:18}
}
},
{
$group: {
_id:"$hometown",
"平均年龄":{$avg:"$age"}
}
}
])
project 管道
就和查询时投影作用一样,如果需要显示字段就设置 1,
db.stu.aggregate([
{
// match 表达式和 查询条件写法一模一样
$match: {
age:{$gt:18}
}
},
{
$project: {
// 显示
age:1,
name:1,
hometown:1,
_id:0
}
}
])
sort 管道
db.stu.aggregate([
{
// match 表达式和 查询条件写法一模一样
$match: {
age:{$gt:18}
}
},
{
$group: {
_id:"$hometown",
"平均年龄":{$avg:"$age"}
}
},
{
$sort:{
"平均年龄":1
}
}
])
limit 管道 和 skip管道
同时使用,有先后顺序操作,谁先就谁操作
db.stu.aggregate([
{
// match 表达式和 查询条件写法一模一样
$match: {
age:{$gt:18}
}
},{
$limit:1
}
])
db.stu.aggregate([
{
// match 表达式和 查询条件写法一模一样
$match: {
age:{$gt:18}
}
},{
$skip:1
}
])
db.stu.aggregate([
{
// match 表达式和 查询条件写法一模一样
$match: {
age:{$gt:18}
}
},{
$limit:2
},{
$skip:1
}
])
unwind 管道
通过某个字段数据拆分,默认情况下如果字段为 空,null,没有字段就会被过滤,如果不想过滤字段就得配置信息
db.t3.aggregate([
// 字段名称
{$unwind:'$size'}
])
// 配置不过滤数据
db.t3.aggregate([
{
$unwind:{
// 指定拆分字段
path:'$size',
// 如果字段为空null和空就保留下来
preserveNullAndEmptyArrays:true
}
}
])
索引
- 查看索引
db.t1.getIndexes()
- 创建索引
db.t1.ensureIndex(
// 建立索引字段名称
{"name":1},
// 是否唯一,默认为 false
{"unique":true}
)
- 删除索引
// 通过获取索引列表查看 name 名称
db.t1.dropIndex("索引名称")
备份恢复
// 作用导出数据库并且进行压缩
mysqldump -u用户 -p密码 数据库名称 | gzip > /data/backup/bks/cslized_$(date +%Y%m%d_%H%M%S).sql.gz
// 第二步 crontab 定制执行这个脚本
用户验证
启动用户验证
// 启动方式一
sudo mongod --auth
// 在配置文件中加入 auth=True
创建root账号
当验证模式启动后,如果数据库中没有 root 账号,那么必须先创建 root 账号
// 进入管理员数据库
use admin
// 创建 root账号
db.createUser(
{
"user":"python",
"pwd":"123456",
"roles":["root"]
}
)
// 一旦创建 root 账号程序就不允许继续创建
登录
// 进入管理员数据库
use admin
// 登录
db.auth('用户名','密码')
创建普通账号
// 进入管理员数据库
use admin
// 创建 普通账号
db.createUser(
{
"user":"db01",
"pwd":"123456",
"roles":[
{
// 指定访问数据库名称
"db":"mydb_01",
// 指定权限 read,write,readWrite
"role":"readWrite"
}
]
}
)
db.createUser(
{
"user":"db02",
"pwd":"123456",
"roles":[
{
// 指定访问数据库名称
"db":"mydb_02",
// 指定权限 read,write,readWrite
"role":"readWrite"
}
]
}
)
显示当前用户列表
show users
删除用户
// 不推荐使用
db.removeUser('用户名')
// 推荐使用
db.dropUser('用户名')
以上内容仅是代表个人总结 若有错误之处,还请批评指正,欢迎大家一起学习!
版权声明:本文为lbj1260200629原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。