一、基本命令
1.使用终端连接:mongo
2.查看当前数据库名称:db
3.查看当前数据库信息:db.status()
4.终端退出连接:exit或ctrl + c
5.列出所有在物理上存在的数据库:show dbs
6.切换数据库,如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建:use 数据库名称
7.删除数据库:db.dropDatabase()
二、集合操作
1.集合创建:db.createCollection(name, options)
默认capped为false即不限制大小,当capped为true时,size为上限大小,文档达到上限时,会将之前的数据覆盖,单位为字节
限制集合大小:db.createCollection("stu", {capped:true, size:10})
2.查看当前数据库的结合:
show collections
3.删除集合
db.集合名称.drop()
4.插入
db.集合名称.insert(document)
5.简单查询
db.集合名称.find()
6.更新
db.集合名称.update(
<query>, 查询条件:类似sql语句Update中的where部分 {name:'def'}
<update>, 更新操作符:类似sql语句update中的set部分,只更新一个字段时使用$set {$set{name:'abc'}}
{multi:<boolean>} 可选,默认为false,表示只更新找到的第一条记录,true时为全部更新
)
7.删除
db.集合名称.remove(
<query>,
{
justOne:<boolean>
}
)
全部删除:db.集合名称.remove({})
三、数据查询
1.方法fiind():查询
db.集合名称.find({条件文档})
2.方法findOne():查询,只返回第一个
db.集合名称.findOne({条件文档})
3.方法pretty():将结果格式化
db.集合名称.find({条件文档}).pretty()
4.比较运算符
小于:$lt
小于或等于:$lte
大于:$gt
大于或等于:$gte
不等于:$ne
示例:db.user.find({age:{$gte:18}})
5.逻辑运算符
逻辑与
示例:db.user.find({name:'张三', age:{$gte:18}})
逻辑或:$or
示例:db.user.find({$or:[{age:{$gte:18}}, {name:'张三'}]})
6.范围运算符
在某个范围内:$in
示例:db.user.find({age:{$in:[18, 28]}})
不在某个范围内:$nin
7.正则表达式
具体规则同js
示例:db.user.find({name:/[a-zA-z]+/})
8.自定义查询
使用$where后面写一个函数,返回满足条件的数据,同js函数
示例:db.user.find({$where:function(){return this.age>20}})
9.limit:获取几条
db.集合.find().limit(number)
10.skip:跳过几条
db.集合.find().skip(number)
11.排序:sort
db.集合.find().sort({字段:1, 字段2:-1})
参数1为升序排列,参数-1为降序排列
12.统计个数:count
db.集合.find({条件}).count()或db.集合.count({条件})
13.消除重复:distinct
db.集合.distinct('去重字段', {条件})
四、高级操作
1.聚合
db.集合.aggregate([管道:{表达式}])
常用管道:
$group:将集合中的文档分组,可用于统计结果
1 db.user.aggregate([ 2 {$group: 3 { 4 _id:'$age', _id表示分组的依据 5 counter:{$sum:1} 具体字段名前要加$ 6 } 使用$$ROOT可以得到整个文档 7 } 8 ])
$match:过滤数据,只输出符合条件的文档
1 db.user.aggregate([ 2 {$match:{age:{$gt:20}}} 3 ]) 4 5 查询年龄大于20的男生、女生人数 6 db.user.aggregate([ 7 {$match:{age:{$gt:20}}}, 8 {$group:{_id:'$gender',counter:{$sum:1}}} 9 ])
$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
查询学生的姓名、年龄 db.stu.aggregate([ {$project:{_id:0,name:1,age:1}} ]) 查询男生、女生人数,输出人数 db.stu.aggregate([ {$group:{_id:'$gender',counter:{$sum:1}}}, {$project:{_id:0,counter:1}} ])
$sort:将输入文档排序后输出
查询学生信息,按年龄升序 b.stu.aggregate([{$sort:{age:1}}]) 查询男生、女生人数,按人数降序 db.stu.aggregate([ {$group:{_id:'$gender',counter:{$sum:1}}}, {$sort:{counter:-1}} ])
$limit:限制聚合管道返回的文件数
$skip:跳过制定数量的文档,并返回余下的文档
统计男生、女生人数,按人数升序,取第二条数据 db.stu.aggregate([ {$group:{_id:'$gender',counter:{$sum:1}}}, {$sort:{counter:1}}, {$skip:1}, {$limit:1} ])
$unwind:将数组类型的字段进行拆分
构造数据 db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']}) 查询 db.t2.aggregate([{$unwind:'$size'}]) 对某字段值进行拆分 处理空数组、非数组、无字段、null情况 db.t3.insert([ { "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] }, { "_id" : 2, "item" : "b", "size" : [ ] }, { "_id" : 3, "item" : "c", "size": "M" }, { "_id" : 4, "item" : "d" }, { "_id" : 5, "item" : "e", "size" : null } ]) 使用语法1查询 db.t3.aggregate([{$unwind:'$size'}]) 查看查询结果,发现对于空数组、无字段、null的文档,都被丢弃了 问:如何能不丢弃呢? 答:使用语法2查询 db.t3.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}])
表达式:
$sum:计算总和,$sum:1同count表示计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中
$first:根据资源文档的排序获取第一个文档的数据
$last:根据资源文档的排序获取最后一个文档的数据
五、索引
1.建立普通索引:db.集合.ensureIndex({属性:1}) 1表示升序索引 -1表示降序索引
2.建立唯一索引:db.集合.ensureIndex({属性:1}, {'unique':true})
3.联合索引:db.集合.ensureIndex({name:1, age:1})
4.查看文档所有索引:db.集合.getIndexes()
5.删除索引:db.集合.dropIndexes('索引名称')
六、安全
1.常用角色
root:只在admin数据库中可用,超级账号,超级权限
Read:只允许读取指定数据库
readWrite:允许用户读写指定数据库
2.创建超级管理员用户
1 use admin 2 db.createUser({ 3 user:'admin', 4 pwd:'123', 5 roles:[{role:'root', db:'admin'}] 6 })
3.安全性流程
修改配置文件 sudo vi /etc/mongod.conf 启用身份验证 注意:keys and values之间一定要加空格, 否则解析会报错 security: authorization: enabled 重启服务 sudo service mongod stop sudo service mongod start 终端连接 mongo -u 'admin' -p '123' --authenticationDatabase 'admin'
七、复制(主从服务器)
1.分别在两台服务器上开启服务 mongod --bind_ip 192.168.1.2 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0(此名字一定要一致) mongod --bind_ip 192.168.1.3 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0 2.客户端连接主服务器 mongo --host 192.168.1.2 --port 27017 3.初始化 rs.initiate() 4.添加副本集 rs.add('192.168.1.3:27017') 5.连接第二个mongo服务器 mongo --host 192.168.1.3 --port 27017 6.如果在从服务器上进行读操作,需要设置rs.slaveOk() rs.slaveOk() db.t1.find()
7.删除从节点
rs.remove('192.168.1.3:27018')
- -h:服务器地址,也可以指定端口号
- -d:需要备份的数据库名称
- -o:备份的数据存放位置,此目录中存放着备份出来的数据
八、备份
1.语法:mongodump -h dbhost -d dbname -o dbdirectory
- -h:服务器地址,也可以指定端口号
- -d:需要备份的数据库名称
- -o:备份的数据存放位置,此目录中存放着备份出来的数据
2.恢复:mongorestore -h dbhost -d dbname --dir dbdirectory
- -h:服务器地址
- -d:需要恢复的数据库实例
- --dir:备份数据所在位置
九、python操作mongodb
进入虚拟环境
sudo pip install pymongo
或源码安装
python setup.py
- 引入包pymongo
import pymongo
- 连接,创建客户端
client=pymongo.MongoClient("localhost", 27017)
- 获得数据库test1
db=client.test1
- 获得集合stu
stu = db.stu
- 添加文档
s1={name:'gj',age:18}
s1_id = stu.insert_one(s1).inserted_id
- 查找一个文档
s2=stu.find_one()
- 查找多个文档1
for cur in stu.find():
print cur
- 查找多个文档2
cur=stu.find()
cur.next()
cur.next()
cur.next()
- 获取文档个数
print stu.count()