安装mongodb
sudo apt-get install -y mongodb-org
创建mongodb文件目录
$ sudo mkdir -p /data/db #创建数据存储目录
$ sudo chmod mongodb:mongodb /data/*
启动、停止、重启
$ sudo service mongodb start
$ sudo service mongodb stop
$ sudo service mongodb restart
进入mongoDB客户端
$ sudo mongo
建议使用robomongo
数据库操作
查看当前数据库名称
db
列出所有在物理上存在的数据库
show dbs
切换数据库
如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建
use Database_Name
删除数据库
drop Database_Name
集合collections
创建集合
db.createCollection(name, options)
- options参数代表长度限制,如果想做限制可以:
db.createCollection("sub", { capped : true, size : 10 } )
查看目前存在的集合
show collections
删除集合
db.Collection_Name.drop()
数据维护
插入
db.collections_name.insert({name:'张三',gender:true})
s1={_id:'20160101',name:'hr'}
s1.gender=0
db.stu.insert(s1)
更新
db.collection_name.update(
<query>,
<update>,
{multi: <boolean>}
)
- <query>要修改的值,这里写一个查询
- <update>修改为什么值
- 默认只修改一条,如果多条修改的话需要第三个参数{multi:true}
db.stu.uppdate({name:'张三'},{age:18}) #这条修改会改变文档的格式
db.stu.uppdate({name:'张三'},{$set:{age:18}}) #这条修改只会改变文档中age的值
删除
db.stu.remove({gender:0},{justOne:true}) #只删除一条匹配的数据
db.stu.remove({}) #删除stu集合中所有数据
数据查询
db.stu.find({name:'张三'}) #基础查询
db.stu.find().pretty() #格式化查询
db.stu.findOne({name:'张三'}) #查询符合条件的一条数据
比较运算符
- 等于,默认是等于判断,没有运算符
- 小于$lt
- 小于或等于$lte
- 大于$gt
- 大于或等于$gte
- 不等于$ne
db.stu.find({age:{$gte:18}})
逻辑运算符
- 查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接
- 逻辑与:默认是逻辑与的关系
db.stu.find({age:{$gte:18}},{title:'python'})
- 逻辑或:使用$or
db.stu.find({age:{$gte:18}},$or:[{title:'python'},{sal:{$lte:1500}}])
范围运算符
- 使用"$in","$nin" 判断是否在某个范围内
db.stu.find(name:{$in:['张三','李四','王五']})
支持正则表达式
- 使用//或$regex编写正则表达式
db.stu.find({name:{$regex:'^王'}})
db.stu.find({name:/^王/})
自定义查询
- 使用$where后面写一个函数,返回满足条件的数据
db.stu.find({$where:function(){return this.age>20}})
LIMIT与SKIP
db.stu.find().limit(2)
db.stu.find().skip(2)
db.stu.find().skip(2).limit(2) #建议先skip再limit
投影
- 在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段
db.stu.find({},{name:1,gender:1}) #查询结果会有的字段是_id、name、gender
db.stu.find({},{_id:0,name:1,gender:1}) #查询结果不会存在_id
排序
- 方法sort(),用于对结果集进行排序
db.stu.find().sort({gender:-1,age:1})
统计个数
- 方法count()用于统计结果集中文档条数
db.stu.find({title:'python'}).count()
db.stu.count({title:'python'})
消除重复
- 方法distinct()对数据进行去重
db.集合名称.distinct('去重字段',{条件})
db.stu.distinct('name',{age:{$gte:20}})
聚合 aggregate
- 语法
db.集合名称.aggregate([{管道:{表达式}}])
- 常用管道
- $group:将集合中的文档分组,可用于统计结果
- $match:过滤数据,只输出符合条件的文档
- $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
- $sort:将输入文档排序后输出
- $limit:限制聚合管道返回的文档数
- $skip:跳过指定数量的文档,并返回余下的文档
- $unwind:将数组类型的字段进行拆分
- 常用表达式
- $sum:计算总和,$sum:1同count表示计数
- $avg:计算平均值
- $min:获取最小值
- $max:获取最大值
- $push:在结果文档中插入值到一个数组中
- $first:根据资源文档的排序获取第一个文档数据
- $last:根据资源文档的排序获取最后一个文档数据
db.stu.aggregate([
{$match:{age:{$gt:20}}},
{$group:{_id:'$title',maxAge:{$max:'$age'}}},
{$sort:{maxAge:-1}},
{$skip:2},
{$limit:1}
])
db.stu.aggregate([
{$project:{_id:0,name:1,age:1}}
])
db.集合名称.aggregate([{$unwind:'$字段名称'}])
db.t2.aggregate([{$unwind:'$size'}])
db.t3.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}]) #消除null或者空数组的影响
索引
创建索引
- 1表示升序,-1表示降序
db.集合.ensureIndex({属性:1})
如
db.stu.ensureIndex({'name':1})
db.stu.ensureIndex({'name':1},{'uniqe':true}) #创建唯一索引
db.stu.ensureIndex({'name':1,'age':-1}) #创建多行索引
查看所有索引
db.stu.getIndexes()
删除索引
db.stu.dropIndexes('索引名') #索引名从db.stu.getIndexes()中查询
安全性
- 常用系统角色如下:
- root:只在admin数据库中可用,超级账号,超级权限
- Read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
mongo登录客户端创建超级管理员用户
use admin
db.createUser({
user:'admin',
pwd:'admin',
roles:[{role:'root',db:'admin'}]
})
修改配置文件启动身份验证
sudo vi /etc/mongod.conf
security:
authorization: enabled #注意enabled前有空格
重启mongd服务
sudo service mongod restart
退出后重新登录
mongo -u admin -p --authenticationDatabase admin
使用超级用户创建普通用户
use runoob #要给哪个数据库创建用户就use哪个
db.createUser({
user:'runoob',
pwd:'runoob',
roles:[{role:'readWrite',db:'runoob'}]
})
退出后使用普通用户登录
mogo -u runoob -p --authenticationDatabase runoob
修改用户:可以修改pwd、roles属性(只能用admin用户修改)
db.updateUser('runoob',{pwd:'123'})
副本集
创建数据存储路径
cd ~/Desktop
mkdir t1
mkdir t2
启动主从服务
mongod --bind_ip 192.168.100.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0
mongod --bind_ip 192.168.100.128 --port 27018 --dbpath ~/Desktop/t2 --replSet rs0
也可以通过配置文件修改启动服务vim /etc/mongod.conf
#主服务配置
port=27018 #指定端口
fork=true #后台运行
dbpath=/home/map/mongodb/mongo #规定数据库的位置
logpath=/home/map/mongodb/mlog/mongodb.log #规定数据库的日志文件
master=true #设置主
# bind_ip=127.0.0.1,192.168.0.4 #允许的地址 为了安全
nohttpinterface=true #禁止http访问
#从服务配置
port=27018 #指定端口
fork=true #后台运行
dbpath=/home/map/mongodb/mongo #规定数据库的位置
logpath=/home/map/mongodb/mlog/mongodb.log #规定数据库的日志文件
slave=true #声明从
source=192.168.0.4:27018 #规定从属于哪个ip 注意:ip是主服务器的 最好用内网ip
# bind_ip=127.0.0.1,192.168.0.4 #允许的地址 为了安全
nohttpinterface=true #禁止http访问
$ sudo mongod -f ./mongod.conf #分别启动主从服务器
连接主服务
mongo --host 192.168.196.128 --port 27017
主服务初始化并查看状态
rs.initiate()
rs.status()
主服务添加从服务集
rs.add('192.168.196.128:27018')
启动从服务
mongo --host 192.168.196.128 --port 27018
向主服务器中插入数据
use test1
for(i=0;i<10;i++){db.t1.insert({_id:i})}
db.t1.find()
在从服务器中插查询
rs.slaveOk()
db.t1.find()
删除从服务
rs.remove('192.168.196.128:27018')
备份与恢复
备份
sudo mkdir test1bak
sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
#不需要安全认证
sudo mongodump -u runoob -p runoob --authenticationDatabase runoob -h 192.168.100.128:27017 -d runoob -o ~/Desktop/back #需要安全认证
恢复
sudo mongorestore -h 192.168.100.128:27107 -d runoob1 -o ~/Desktop/back #不需要安全认证
sudo mongorestore -u admin -p admin --authenticationDatabase admin -h 192.168.100.128:27017 -d runoob1 -o ~/Desktop/back #需要安全认证
网友评论