mongodb
一、安装
# linux 安装
下载mongodb,并解压
# 进入mongodb目录,在目录下创建数据存储目录
mkdir -p data/db
启动
mongodb 的启动方法分为两种方式
- 前置启动
- 后置启动
无论哪种启动方式都需要执行mongodb/bin目录中的mongod命令
前置启动
# 进入mongodb/bin
# --dbpath 就是上一步自己创建的data/db那个目录
./mongod --dbpath /www/server/mongodb/data/db
# 关闭
CTRL + c
后置启动
# 进入mongodb目录中
cd /www/server/mongodb
# 创建日志文件目录
mkdir log
# 进入日志文件目录中
cd log
# 创建日志文件
touch mongodb.log
# 进入mongodb/bin
cd /www/server/mongodb/bin
# 启动
./mongod --dbpath /www/server/mongodb/data/db --logpath /www/server/mongodb/log/mongodb.log --fork
# 关闭
./mongod --shutdown --dbpath /www/server/mongodb/data/db
通过配置文件启动
# 进入mongodb根目录创建配置文件
cd /www/server/mongodb
vi mongodb.conf
# 以下是文件内容
dbpath=/www/server/mongodb/data/db
logpath=/www/server/mongodb/log/mongodb.log
fork=true
port=27017
bind_ip=0.0.0.0
logappend=true
#保存
# 启动
./bin/mongod --config /www/server/mongodb/mongodb.conf
# 查看启动状态
ps aux | grep mongodb
# 关闭
./bin/mongod --shutdown --config /www/server/mongodb/mongodb.conf
常见启动参数
--quiet 安静输出
--port 指定服务端口号 默认27017
--bind 绑定服务IP,若绑定127.0.0.1,则只能本机访问
--logpath 指定服务日志文件,
--logappend 使用追加的方式写日志
--fork 守护进程方式启动
--auth 启动验证
--config 只当配置文件路径,是文件不是目录
--journal 启动日志选项,mongodb的数据库操作将会写入到journal文件夹的文件里
配置环境变量,使任何目录下都可以操作mongodb
vi etc/profile
# 进入文件最下方,追加如下内容并保存
export PATH=$PATH:/www/server/mongodb/bin
# 重载配置
source /etc/profile
# 查看是否成功
mongod --help
权限管理
权限列表
权限值 | 说明 |
---|---|
Read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引的创建、删除,查看统计或访问system.profile |
userAdmin | 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 |
clusterAdmin | 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限 |
readAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库读权限 |
readWriteAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库读写权限 |
userAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的user Admin权限 |
dbAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限 |
root | 只在admin数据库中可用,超级账户,超级权限 |
查看admin中的用户
use admin
db.system.users.find()
创建用户
db.createUser({
user:"gangan",
pwd:"1234560",
roles:[
{role:"userAdminAnyDatabase",db:"admin"}
]
})
# 重启生效
db.shutdownServer()
使用权限方式启动mongodb
在启动的配置文件中添加auth=true
dbpath=/www/server/mongodb/data/db
logpath=/www/server/mongodb/log/mongodb.log
fork=true
port=27017
bind_ip=0.0.0.0
logappend=true
auth=true
重启mongodb即可
认证函数
db.auth("username","password")
创建普通用户
db.createUser({
user:"tt",
pwd:"123456",
roles:[
{
role:"readWrite",
db:"article"
}
]
})
# 在哪个库创建的就需要在那个库登录
更新用户角色
使用db.updateUser()来更新用户角色,该函数需要用户具有userAdminAnyDatabase或者更高权限
db.updateUser("gangan",{roles:[
{role:"userAdminAnyDatabase",
db:"admin"},
{role:"dbAdminAnyDatabase",
db:"admin"}
]})
更新用户密码
- 使用db.updateUser()
# 需要进入admin 数据库操作
db.updateUser("username",{pwd:"123456"})
- 使用db.changeUserPassord()
db.changeUserPassword("username","password")
删除用户
通过db.dropUser()函数删除用户,删除需要切换到创建用户时所指定的数据库才可以删除,操作用户需要具备userAdminAnyDatabase权限
db.dropUser("username")
数据库操作
一、创建数据库
在mongodb中创建数据库使用的是use 命令,该命令有两层含义
- 切换到指定数据库
- 如果数据库不存在则创建该数据库
use article
二、查看所有数据库
如果开启了用户认证,则需要完成认证过后才能使用该命令
如果是普通用户登录时,那么只能查看该用户拥有的数据库
show dbs
三、 删除数据库
使用db.dropDatabase()函数来删除数据库,需要操作用户具备dbAdminAnyDatabase权限,然后切换到需要删除的数据库,执行该命令
db.dropDatabase()
集合操作
一、创建集合
使用db.createCollection()函数来床架集合
语法格式:db.createCollection(name,option)
name:要创建的集合名称
option:可选参数,指定有关内存大小及索引的选项
option参数参考如下:
|字段|类型|描述|
|—|
|capped|bool|可选参数,如果为true,则创建固定集合。固定集合是指有固定大小的集合,当达到最大值时,他会自动覆盖最早的文档|
|autoindxid|bool|可选如果为true自动在_id字段创建索引,默认为false|
|size|number|可选为固定集合指定最大值,单位字节。如果capped为true,也需要指定该字段|
|max|number|可选,指定固定集合中包含文档的最大数量|
db.createCollection("collectionName",{capped:true,autoindxid:true,size:200000,max:1000})
二、隐式创建集合
db.collectionname.insert({name:"gangan"})
查询集合列表
show collections
or
show tables
删除集合
需要切换到删除集合的数据库
db.collection.drop()
文档操作
一、插入文档
插入单个文档
# 使用insert
db.collectionName.insert({
name:"gangan",
hobby:["篮球","足球","羽毛球"],
info:{
length:"170",
weigth:"60"
}
})
# 使用save
db.collectionName.save({
name:"gangan",
hobby:["篮球","足球","羽毛球"],
info:{
length:"170",
weigth:"60"
}
})
# 使用insertOne(3.2版本后才有)
db.collectionName.insertOne({
name:"gangan",
hobby:["篮球","足球","羽毛球"],
info:{
length:"170",
weigth:"60"
}
})
插入多个文档
# insret or save都能实现
# insertMany(3.2可用)
db.collectionName.insert([
{
name:"gangan",
hobby:["篮球","足球","羽毛球"],
info:{
length:"170",
weigth:"60"
}
},
{
name:"gangan2",
hobby:["篮球","足球","羽毛球"],
info:{
length:"170",
weigth:"60"
}
}
])
通过变量插入
document=({name:"gangan",age:"18"})
db.collectionName.insert(document)
二、更新文档
- 使用db.collectionName.update({查询条件},{更新内容},{更新可选参数}),此操作会覆盖原来的内容,可选参数为{multi:true}时批量更新
db.collectionName.update({name:"gangan"},{name:"ganganUpdate"})
- 使用$set操作符进行update更新,此操作不会覆盖原来的内容,当更新的内容不存在时会增加修改内容,可选参数为{multi:true}时批量更新
db.collectionName.update({name:"ganganUpdate"},{set:{name:"gangan"}},{multi:true})
- 使用$inc操作符对字段进行自增处理,可选参数为{multi:true}时批量更新
db.collectionName.update({name:"gangan"},{$inc:{score:1}})
db.collectionName.update({name:"gangan"},{$inc:{score:-2}})
- 使用$unset操作符进行删除处理,可选参数为{multi:true}时批量更新
db.collectionName.update({name:"gangan"},{$unset:{sex:1}})
- 使用$push操作符,向文档的某个数组类型的键添加数组元素,不过滤数组元素,要求键类型必须为数组类型,键不存在则创建
db.collectionName.update({name:"gangan"},{$push:{tag:"javascript"}})
- 使用$pop操作符,从数组尾部删除元素
# tag后面的为正值时,从后往前删除,反之从前往后删除
db.collectionName.update({name:"gangan"},{$pop:{tag:1}})
- 使用pull操作符,删除数组中指定元素
db.collectionName.update({name:"gangan"},{$pull:{tag:"go"}})
- 使用pullAll操作符,删除数组中指定的多个元素
db.collectionName.update({name:"gangan"},{$pullAll:{tag:["tag1","tag2"]}})
- 使用$rename操作符
db.collectionName.update({nam:"gangan"},{$rename:{tag:"tags"}})
三、删除文档
- 使用remove()函数,不推荐使用
语法格式:remove({删除条件},删除参数(可选))
#存在可选参数表示只删除一条
db.collectionName.remove({name:"gangan"},1)
#不存在第二个参数表示删除所有符合条件的数据
db.collectionName.remove({name:"gangan"},1)
remove()方法并不会真正释放空间,需要继续执行db.repairDataBase()来回收磁盘空间
- 使用deleteOne()函数,删除单个文档,推荐使用
db.collectionName.deleteOne({name:"gangan"})
- 使用deleteMany()函数,删除满足条件的所有数据,推荐使用
db.collectionName.deleteMany({name:"gangan"})
#删除所有文档
db.collectionName.deleteMany({})
#删除整张表
db.collectionName.drop()
四、查询文档
1、find() 函数
在mongoDb中可以使用find()函查询文档
语法格式:find({查询条件(可选)},{指定投影的键(可选)})
pretty()函数可以使用格式化的方式来显示所有文档
如果未给定参数则表示查询所有数据
# 查询所有文档
db.articles.find()
#查询指定条件文档
db.articles.find({name:"gangan"})
#查询指定字段文档
db.articles.find({name:"gangan"},{_id:0,contentt:1})
2、查询符合条件的单条数据
db.articles.findOne()
3、模糊查询
通过//、^、$实现模糊查询,注意使用模糊查询时查询条件不能放在双引号或单引号中
#查询字符串包含a的数据
db.articles.find({content:/a/})
#查询字符串以g开头的文档
db.articles.find({content:/^g/})
#查询以n结尾的文档
db.articles.find({content:/n$/})
五、条件操作符
1、 g t 、 gt、 gt、lt、 g t e 、 gte、 gte、lte
我们可以使用 g t 、 gt、 gt、lt等操作做条件判断,该操作符可以对数字或日期进行判断
语法格式:find({key:{操作符:条件}}) or findOne({key:{操作符:条件}})
db.articles.find({view:{$gt:10}})
db.articles.find({view:{$gte:10}})
db.articles.find({view:{$lt:10}})
db.articles.find({view:{$lte:10}})
2、 e q 、 eq、 eq、ne
$eq:用于两个条件相等的操作判断
$ne:用于两个条件不相等的操作判断
# 查找view等于10的文档
db.articles.find({view:{$eq:10}})
# 查找view不等于10的文档
db.articles.find({view:{$ne:10}})
3、$and $or
$and:此操作符用来表示并且的关系
语法格式:find({$and:[{条件一},{条件二}]})
#查询view>5 and view < 100的文档数据
db.articles.find({$and:[{view:{$gt:5}},{view:{$lt:100}}]})
#查询view<=5 or view >= 100的文档数据
db.articles.find({$or:[{view:{$lte:5}},{view:{$gte:100}}]})
#联合使用
db.articles.find({$and:[{$or:[{desc:"d2"},{desc:"d3"}]},{view:100}]})
4、$type 操作符
基于bson类型来检索集合中匹配的数据,并返回匹配结果
db.articles.find({content:{$type:"number"}})
六、limit函数与skip函数
1、limit函数
如果需要在mongoDB中拂去指定数量的数据记录,可以使用此函数
语法格式:db.collectionName.find().limit(int)
db.articles.find().limit(2)
2、skip函数
通常用来结合limit()函数做分页处理,用来表示跳过多少条数据
db.articles.find().skip(2).limit(2)
七、sort排序
通过参数指定排序字段,并使用1和-1来指定排序的方式,其中1为升序、-1为降序
语法格式:db.collectionName.find().sort({field:-1})
db.articles.find().sort({view:-1})
索引操作
一、创建索引
使用createIndex()函数来创建索引,在创建索引时需要指定排序规则,1 按照升序规则常见索引,-1 按照降序规则创建索引
语法格式:db.collectionName.createIndex({field1:1,field2:-1},{创建索引的参数(可选)})
参数 | 数据类型 | 默认值 | 说明 |
---|---|---|---|
background | boolean | false | 后台创建索引,以便于创建索引时不阻止其他数据库的活动 |
unique | boolean | false | 创建唯一索引 |
name | string | 索引名称,未指定时mongodb会生成一个索引字段的名称和排序顺序串联 | |
partialFilterExpreession | document | 如果指定mongodb指挥满足过滤表达式的记录 | |
sparse | boolean | false | 对文档不存在的字段不启用索引 |
epireAfterSeconds | integer | 指定索引过期时间 | |
storageEngine | document类型允许用户配置索引的储存引擎 |
db.articles.createIndex({view:-1},{background:true})
二、查看索引
db.articles.getIndexes()
三、查看索引的键
通过使用getIndexKeys()函数查看集合的索引键
db.articles.getIndexKeys()
四、查看集合索引的大小,单位为字节
# 查看总的索引大小
db.articles.totalIndexSize()
#查看每个索引大小
db.articles.totalIndexSize(true)
五、修改索引
mongodb没有提供方法来修改索引,所以我们只有先删除索引,再创建索引
六、删除索引
# 删除指定索引
db.articles.dropIndex("content_1")
# 删除所有索引
db.articles.dropIndexes()
六、查询计划
通过explain()函数来启动查询计划,分析索引使用情况
语法格式:db.collectionName.find({}).explain()
db.articles.find().explain()
正则查询
语法1:db.collectionName.find({field:正则表达式})
语法2:db.collectionName.find({field:{ r e g e x : 正 则 表 达 式 , regex:正则表达式, regex:正则表达式,options:正则选项}})
正则表达式格式:/xx/
正则选项
- i - 不区分大小写以匹配大小写的情况
- m - 多行查找,如果内容里面不存在换行(例如:\n)或者条件上没有(start、end),那么该选项没有任何效果
- x - 设置x选项后,正则表达式中的非转义的空白字符将被忽略。需要 r e g e x 与 regex与 regex与options语法
#查询以 * 开头
db.articles.find({name:/^S/})
#查询以 * 结尾
db.articles.find({name:/n$/})
# 查询包含 * 内容
db.articles.find({content:/g/})
# 查询 * 开头,忽略大小写
db.articles.find({content:/^T/i})
# 查询以 T 开头,以 2 结尾的
db.articles.find({content:/^T.*2$/i})
# 查询以T或者g开头的内容,忽略大小写
db.articles.find({content:/(^T|^g)/i})
# 查询不以t开头的内容
db.articles.find({content:/^[^t]/})
聚合查询
通过aggregate()函数来完成一些聚合查询
语法格式:
db.collectionName.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:"分组键名","$分组键明",…,别名:{聚合运算:“¥运算列”}}},{条件筛选:{运算条件:运算值}}])
SQL操作/函数 | mongoDb聚合操作 |
---|---|
where | $match |
group by | $group |
having | $match |
select | $project |
order by | $sort |
limit | $limit |
sum | $sum |
count | $sum |
join | $lookup |
1、求和 - $sum
# 相当于select count(*) as count from articles
db.articles.aggregate([{$group:{_id:null,count:{$sum:1}}}])
# 求某个字段的值
# select sum(view) as viewTotal from articles
db.articles.aggregate([{$group:{_id:null,viewTotal:{$sum:'$view'}}}])
# 查询view之和,并根据desc分组
# select desc as _id sum(view) as viewTotal from articles group by desc
db.articles.aggregate([{$group:{_id:'$desc',viewTotal:{$sum:'$view'}}}])
2、条件筛选 - $match
# 查找view大于50的数据条数
# sql select count(*) from article where view > 50
db.articles.aggregate([{$match:{view:{$gt:50}}},{$group:{_id:null,totalSize:{$sum:1}}}])
3、最大值、最小值、平均值
# 最大值
db.articles.aggregate([{$group:{_id:null,maxSize:{$max:"$view"}}}])
# 最小值
db.articles.aggregate([{$group:{_id:null,minSize:{$min:"$view"}}}])
# 平均值
db.articles.aggregate([{$group:{_id:null,avgView:{$avg:"$view"}}])
4、聚合查询字段投影 - $project
db.articles.aggregate([{$group:{_id:null,avg:{$avg:"$view"}}},{$project:{_id:0,avg:"$avg"}}])
日期处理
# 插入指定日期
# 标准时间格式 yyyy-mm-ddTHH:ii:ssZ
db.articles.insert({date:new Date("2021-04-16T23:30:22Z")})
# 使用ISODate("2021-0-16 23:30:22"),这个函数对时间格式要求低,推荐使用这个方法
dn.article.insert({date:ISODate("2021-04-16 23:22:3")})