mongodb笔记
安装启动
centos系统下
安装
sudo yum -y install mongodb mongodb-devel mongodb-server
启动
sudo systemctl start mongod
关闭
sudo systemctl stop mongod
mongodb数据库操作
js + 面向对象
前提条件
使用 mongo 客户端登录
数据库列表
show databases/dbs
进入数据库
use 数据库名称
显示当前数据库
db
创建数据库
插入数据即创建数据库
删除数据库
// 注意当前数据库到底是哪个
db.dropDatabase()
数据库集合(表)操作
列出所有集合
show collections
创建集合
// 必须到数据库中
db.createCollection("集合名称")
// 或
// 插入数据即创建集合
修改集合名称
db.集合名.renameCollection('新集合名')
删除集合
db.集合名.drop()
数据操作
创建数据
db.集合名.insert(字典)
// 批量创建数据
data = [
{
"name":"a同学",
"age":50
},
{
"name":"小艾同学",
"age":100
}
]
db.mycoll2.insertMany(data)
更新数据
默认更新是整体更新,需要添加
$set
设置局部更新内容,默认情况下只更新1
条数据,需要添加批量更新,需要添加更新方式multi
设置true
db.stu.update(
// 更新条件
{
"hometown":"蒙古"
},
// 更新内容
{
"name":"播客"
}
)
// 局部更新
db.stu.update(
// 更新条件
{
"hometown":"桃花岛"
},
// 更新内容
{
"$set":{
// 局部更细内容
"name":"python2"
}
}
)
// 批量局部更新
db.stu.update(
// 更新条件
{
"hometown":"大理"
},
// 更新内容
{
"$set":{
// 局部更细内容
"name":"Python3"
}
},
// 设置更新方式
{
// 设置成批量更新
"multi":true
}
)
保存数据
_id
表示数据主键,必须存在,如果不存在自动生成一个,手动设置寻找 是否 有
_id
数据如果有就更新,如果没有就创建,保存的依据_id
db.stu.save({"_id":1233456,'ccc':"xxxx1"})
删除数据
db.stu.remove(
// 删除条件
{
"hometown":"桃花岛"
}
)
// 设置删除方式
db.stu.remove(
// 删除条件
{
"hometown":"大理"
},
// 设置删除方式
{
"justOne":true
}
)
// 清空数据
db.stu.remove({})
查询数据
基本查询
如果同时存在两个条件,这两个条件必须同时满足
并且
db.集合名.find().pretty()
// 条件查询
db.stu.find(
// 设置查询条件
{
"hometown":"蒙古",
"age":20
}
)
比较运算符
$gt
,$gte
,$lt
,$lte
,$ne
db.stu.find(
{
"age":{"$gt":20}
}
)
逻辑运算符
并且
默认
或
使用关键字$or
db.stu.find(
{
"$or":[
{
"hometown":"蒙古"
},
{
"age":18
}
]
}
)
范围运算符
$in
,$nin
db.stu.find(
{
"hometown":{"$nin":['蒙古','桃花岛']}
}
)
正则表达式
db.stu.find(
{
// 在js中使用正则表达式 /正则表达式/
"name": /^黄/
}
)
// 或 使用关键字 $regex
db.stu.find(
{
"name":{"$regex":"^黄"}
}
)
自定义查询
使用
$where
关键字 设置自定义查询函数
db.stu.find(
{
"$where": function() {
// 1. 内部有一个 this 关键字指向当前记录
// 2. 返回值必须是 boolean 值,true 表示 符合条件,false 表示 不符合条件
if (this.age > 20) {
return true
} else {
return false
}
}
}
)
limit 和 skip
limit 获取记录数
skip 跳过记录数
limit 和 skip 没有先后顺序,先 skip 再 limit 不管先后
db.stu.find().limit(2).skip(1)
db.stu.find().skip(1).limit(2)
投影
控制显示字段
字段设置为
1
表示显示字段,默认情况下_id
显示,可以手动设置_id
为0
表示隐藏_id
db.stu.find(
// 查询条件
{},
// 投影条件
{
"name":1,
"age":1,
"_id":0
}
)
排序
1
表示升序
-1
表示降序
db.stu.find().sort(
// 设置排序条件
{
"age":-1
}
)
统计个数
db.stu.find().count()
// 或者
db.stu.count({})
消除重复
db.stu.distinct(
// 设置去重字段
"hometown",
// 设置查询条件
{
"age":{$gt:18}
}
)
聚合(aggregate)
聚合
主要用于统计数据(求最大值,求最小值,求平均值等等)
find
主要用于查询数据
聚合格式写法
db.stu.aggregate([
{
管道名: {表达式}
},
{
管道名: {表达式}
},
...
])
group 管道
对数据进行分组,统计
db.stu.aggregate([
{
"$group": {
// "_id" 固定值 设置分组,设置字段,注意:前面必须添加 `$`
// 注意: "_id" 如果设置为 null 表示把所有数据作为 一组
"_id":null,
// "_id":"$hometown",
// 编写表达式
// $sum 表示求数量
// "求最大值":{$sum:1},
// $avg 求平均值
// "求平均年龄":{$avg:"$age"},
// $max 求最大值
"求最大年龄":{$max:"$age"},
// $min 求最小值
// "求最小年龄":{$min:"$age"},
// $push 把分组中的数据放入到列表中
// 特殊的值 $$ROOT 把整条数据记录放入到列表中
// "来地区的人物": {$push:"$name"}
// "xxx": {$push:"$$ROOT"}
}
}
])
match 管道
查询过滤数据
db.stu.aggregate([
{
"$match": {
// 写法和find查询条件一样
"age":{$gt:20}
}
},
{
"$group":{
"_id":null,
"最大年龄":{$max:"$age"}
}
}
])
project 管道
和投影一样
db.stu.aggregate([
{
"$match": {
// 写法和find查询条件一样
"age":{$gt:20}
}
},
{
"$group":{
"_id":null,
"最大年龄":{$max:"$age"}
}
},
{
// 内容写法和投影写法一样
"$project":{
"_id":0,
"最大年龄":1
}
}
])
sort管道
db.stu.aggregate([
{
"$match": {
// 写法和find查询条件一样
"age":{$gt:20}
}
},
{
"$sort":{
// 和 sort语法一样 1 表示升序,-1 表示降序
"age":-1
}
}
])
limit管道 和 skip管道
管道 limit 和 skip 有先后顺序
db.stu.aggregate([
{
"$match":{
"age":{$gte:18}
}
},
{
"$skip":1
},
{
"$limit":2
}
])
unwind 管道
数据拆分,默认情况下忽略 值为空,空列表,null,字段不存在的数据
db.t2.aggregate([
{
"$unwind":"$vals"
}
])
// 设置不忽略为空,为null的情况
db.t2.aggregate([
{
"$unwind":{
"path":"$vals",
"preserveNullAndEmptyArrays":true
}
}
])
索引
for (var i = 0;i < 100000;i ++) {
db.test3.insert({
"name":"abc"+i,
"idx":i
})
}
// 查询数据
db.test3.find(
{
"name":"abc99999"
}
).explain('executionStats')
// 添加索引
db.test3.ensureIndex(
// 设置索引字段
{
"name":1
}
)
// 查看当前集合的索引
db.test3.getIndexes()
// 删除索引
db.test3.dropIndex('索引名称')
权限管理
必须先创建 超级管理员 账号,一旦创建成功就生效,再创建超级管理员账号是无法创建
use admin
db.createUser(
{
"user":"python",
"pwd":"123456",
"roles":['root']
}
)
登录
use admin
db.auth('用户名','密码')
创建普通用户账号并且携带访问权限
// 前提必须是超级管理员登录
use admin
db.createUser(
{
"user":"db03",
"pwd":"123456",
"roles":[
{
"db":"db03",
// write,read,readWrite
"role":"readWrite"
}
]
}
)
列出当前所有用户
show users
删除用户
// 前提必须是超级管理员登录
use admin
db.dropUser('用户名')
备份 mongodump和mongorestore都是在终端上运行而不是在mongo客户端运行
mongodump -h dbhost -d dbname -o dbdirectory
mongodump -h 127.0.0.1 -d my_mongo -o ~/Desktop
恢复
mongorestore -h dbhost -d dbname --dir dbdirectory
mongorestore -h 127.0.0.1 -d my_mongo --dir ~Desktop/my_mongo
定时备份
crontab 定义执行脚本备份数据库
# mysql 定时备份脚本
mysqldump -u用户名 -p密码 cslized | gzip > /data/backup/bks/cslized_$(date +%Y%m%d_%H%M%S).sql.gz
# mongodb 定时备份脚本
mongodump -h dbhost -d dbname -o dbdirectory | gzip > /data/backup/bks/cslized_$(date +%Y%m%d_%H%M%S).sql.gz
# 测试数据
db.stu.drop()
db.stu.insert({_id : 1, name:'郭靖',hometown:'蒙古',age:20,gender:true})
db.stu.insert({_id : 2, name:'黄蓉',hometown:'桃花岛',age:18,gender:false})
db.stu.insert({_id : 3, name:'华筝',hometown:'蒙古',age:18,gender:false})
db.stu.insert({_id : 4, name:'黄药师',hometown:'桃花岛',age:40,gender:true})
db.stu.insert({_id : 5, name:'段誉',hometown:'大理',age:16,gender:true})
db.stu.insert({_id : 6, name:'段王爷',hometown:'大理',age:45,gender:true})