环境交代
操作系统: CentOS 6.8 64位
mongodb: 4.06
安装
官方下载地址:https://www.mongodb.org/dl/linux/x86_64-rhel62
阿里云镜像地址:
mongodb-server: https://mirrors.aliyun.com/mongodb/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-server-4.0.6-1.el6.x86_64.rpm
mongodb-shell: https://mirrors.aliyun.com/mongodb/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-shell-4.0.6-1.el6.x86_64.rpm
如果我们下载的mongodb是社区版的源码包,那么官方已经帮我们编译好,因此不需要我们再次编译,我们只需将下载的文件解压后移动到安装目录即可,比如:移动到/usr/local/mongodb。
当然我们这里使用的是rpm
包安装:
下载:
wget https://mirrors.aliyun.com/mongodb/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-server-4.0.6-1.el6.x86_64.rpm
wget https://mirrors.aliyun.com/mongodb/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-shell-4.0.6-1.el6.x86_64.rpm
安装
rpm -ivh mongodb-org-server-4.0.6-1.el6.x86_64.rpm
rpm -ivh mongodb-org-shell-4.0.6-1.el6.x86_64.rpm
执行完以上两个步骤,安装完成后,我们的系统中会多出两个命令:mongo
(客户端) 和 mongod
(服务端),同时生成一个配置文件在/etc/mongod.conf
。
启动
启动服务端
方式1:
# 指定配置文件启动
mongod --config /etc/mongod.conf
方式2:
如果先使用上一种方式启动,那么使用下面的方法的时候很可能会遇到错误,错误可根据报错内容以及日志内容进行解决。默认日志路径:/var/log/mongodb/mongod.log
。以下方式启动,会默认使用/etc/mongod.conf
的配置文件。
# 启动
service mongod start
# 重启
service mongod restart
# 关闭
service mongod stop
# 设置开机启动
chkconfig mongod on
mongodb配置说明请参考:
https://www.jianshu.com/p/ba63f6c5ad04
https://www.cnblogs.com/zhoujinyi/p/3130231.html
启动客户端
# 启动客户端连接服务端
mongo
#客户端的更多使用方式查看
mongo --help
使用
基本使用
# 查看数据库
show dbs
show databases
查看数据表(其实叫集合更合适)的列表
show tables
show collections
# 切换数据库
use tableName
# 查看命令帮助
db.help()
# 删除tableName表,tableName为表名称
db.tableName.drop()
# 删除当前切换到的数据库
db.dropDatabase()
# 创建表
db.createCollection(tableName)
隐式添加
如果下级结构添加了,那么上级结构自动也被添加
比如:我在一个不存在的数据库下创建了一张表,那么这个数据库会被自动创建。
数据表也支持隐式创建
插入数据
db.tableName.insert()
例1:往user表插入一条
db.user.insert({'name':'shusheng'})
db.user.insertOne({'name':'shusheng'})
例2:往user表插入多条
db.user.insert([{'name':'郭昌松','age':20}, {'name':'李志友','girl':['李文斌,李志光']}])
db.user.insertMany([{'name':'郭昌松','age':20}, {'name':'李志友','girl':['李文斌,李志光']}])
MongoDb支持的数据类型
数据类型 | 说明 | 补充说明 |
---|---|---|
Object ID | 文档id | |
String | 字符串 | 必须是utf-8编码 |
Boolean | 布尔值 | 只能是 true或者false |
Double | 浮点型 | |
Arrays | 数据(列表) | |
Object | 类似于Python的字典或者js中的json | |
Null | 只能存Null | |
TimeStamp | 时间戳 | |
Date | unix格式的时间 YYYY-MM-DD |
new Date('2019-02-14') |
注:
每个文档都有的一个属性,其名字为_id
,我们可以自己设置,如果未设置,那么mongodb会自动抱我生成,类型为Object ID。自动生成的Object ID是由12位的16进制数组成。前4个为当前时间戳,接下来3个位机器ID,接下来2个为mongodb服务的进程id,最后为自增数据、
查询数据
db.tableName.find(where, fileds)
where
:查询条件,可选
fileds
获取指定的列, 可选
操作 | 格式 | 范例 | 关系型数据库中的类似语句 |
---|---|---|---|
等于 | {<key>:<value>} |
db.col.find({"by":"书生"}).pretty() |
where by = '书生' |
小于 | {<key>:{$lt:<value>}} |
db.col.find({"likes":{$lt:50}}).pretty() |
where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} |
db.col.find({"likes":{$lte:50}}).pretty() |
where likes <= 50 |
大于 | {<key>:{$gt:<value>}} |
db.col.find({"likes":{$gt:50}}).pretty() |
where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} |
db.col.find({"likes":{$gte:50}}).pretty() |
where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} |
db.col.find({"likes":{$ne:50}}).pretty() |
where likes != 50 |
注:使用pretty()
可以让查询到的数据以更好看的形式展现。
例1:
db.member.find({name:'baba'})
查询name='baba'的记录
例2:
db.member.find({name:'baba',age:30})
查询name='baba'并且age=30的记录
例3:
db.member.find({age:{$lt:26}})
查询age小于26的记录
例4:
db.member.find({age:{$lt:26, $gt:20}})
查询age大于20小于26的记录
例5:(投影操作)
db.user.find({},{name: 1, _id: 0 })
查询所有的数据,只获取name
列的值。name
的值为1表示获取该列的值,为0表示不获取该列的值。
附:以格式化后的结构展示查询结果
db.tableName.find(where).pretty()
删除数据
db.member.remove(where,justOne)
where
:删除的条件表达式
justOne
:当符合条件的文档有多条时,为true
只删除一条记录,为false
表示全部删除,默认为false
更新数据
基本语法:
db.tableName.update(where, data, upsert, multi)
where
:条件表达式(更新的条件)
data
:要更新的数据
upsert
:为true
时,表示如果根据查询条件表达式找不到记录,则将准备更新的数据插入到表中作为一条新记录,默认为false
multi
:默认为false
,表示只更新符合条件的一条记录,如果为true时,表示更新所有的符合条件的记录,该参数必须在含有$操作下才生效
例子的数据准备:
db.member.insert({name: 'baba', age: 30, sex: '男', 'money': 999999999})
默认情况下,update会覆盖整个文档(整条记录内容)
例1:
db.member.update({name: 'baba'},{'money': 99999999998})
执行完上面的操作,整条记录会变成:{'money': 99999999998}
只更改部分字段值
db.tableName.update(条件表达式, {$set: 修改的内容})
$set
可以指定修改某些字段(键)
例2:
db.member.update({name: 'baba'}, {$set: {'money': 99999999998}})
执行完上面的操作,整条记录会变成:{name: 'baba', age: 30, sex: '男', 'money': 99999999998}
例3:第三个参数的使用例子
db.member.update({name: 'bingbing'}, {name: 'libingbing', age: 40}, true)
如果根据{name: 'bingbing'}
找不到符合条件的记录,则将{name: 'libingbing', age: 40}
插入到数据表中作为一条新记录。
例4:第四个参数的使用例子
正确使用方法:
db.member.update({name: '小锅'}, {$set: {name: '火锅', age: 3}}, false, true)
错误使用方法:
db.member.update({name: '小锅'}, {name: '火锅', age: 3}, false, true)
更多查询条件
逻辑运算符的使用
AND查询:在Json中直接编写多个条件即可。
# 查询name为baba 并且 age等于30的
db.member.find({name: 'baba', age: 30})
OR 查询:值应该是一个数据,使用$or
标记
# 查询name为baba 或者 age等于30的
db.member.find({$or: [{name: 'baba', age: 30}]})
# 查询 (name为baba 或者 age等于30) 并且性别为1的
db.member.find({$or: [{name: 'baba', age: 30}], sex: 1})
范围运算符 $in
、$nin
判断是否在某个范围
db.member.find({age: {$in: [20, 22, 24]}})
正则条件 使用定界符 //
或者$regex
db.member.find({name: {$regex: '^ond+'}})
db.member.find({name: /^ond+/})
自定义查询 $where
可以直接使用js编写条件语句。
db.member.find({ $where: function(){
# this 指当前记录, 即每一条记录。查询会扫描整个表中的所有数据
return this.age > 20;
}
})
读取指定数量的文档
会用到limit()
和skip()
。
limit(n)
:获取指定数量的文档
skip(n)
:跳过指定数量的文档
db.member.find({age: 20}).limit(3)
db.member.find({age: 20}).skip(1)
db.member.find({age: 20}).limit(3).skip(1)
db.member.find({age: 20}).skip(1).limit(3)
排序 sort()
db.member.find().sort({age: -1, sex: 1})
统计 count()
db.member.find().count()
db.member.find({条件})count()
db.member.count()
db.member.count({条件})
去重 distinct()
# 去重字段要被引号包着
db.member.distinct("去重字段")
db.member.distinct("去重字段", {条件})
聚合操作 aggregate()
mongodb的聚合操作是基于管道来处理的。文档可以多个处理过程(stage),各个过程之间由管道相连,每一步处理的结果会是下一步处理的输入值。类似于流水线处理。
基本语法:
db.表名称.aggregate({管道: {处理表达式}})
常用管道有:
管道名称 | 说明 |
---|---|
$group | 分组操作 |
$match | 过滤 |
$project | 修改文档结构,如:重命名、增加、删除字段等 |
$sort | 排序后输出 |
$limit | 限制条数 |
$skip | 跳过文档 |
$unwind | 将数组类型的列进行拆分 |
常用处理表达式有:
表达式名称 | 说明 |
---|---|
$sum | 求和 |
$avg | 求平均值 |
$min | 求最小值 |
$max | 求最大值 |
$push | 在结果文档中插入值到一个数组中 |
$first | 获取一个文档数据 |
$last | 获取最后一个文档数据 |
Python操作MongoDB
pip3 install pymongo
https://blog.csdn.net/adley_app/article/details/80715630
https://www.cnblogs.com/zhangxinqi/p/9242687.html
设置用户和密码
开启认证
mongod --auth # 启用认证
创建管理员用户
use admin
db.createUser({user:"admin",pwd:"password",roles:["root"]})
admin(用户名)password(密码)root(超级账号)
内建角色
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
认证登录
db.auth("用户名", "密码")
MongoDB role 类型
数据库用户角色(Database User Roles)
read:授予User只读数据的权限
readWrite:授予User读写数据的权限
数据库管理角色(Database Administration Roles):
dbAdmin:在当前dB中执行管理操作
dbOwner:在当前DB中执行任意操作
userAdmin:在当前DB中管理User
备份和还原角色(Backup and Restoration Roles):
backup
restore
跨库角色(All-Database Roles):
readAnyDatabase:授予在所有数据库上读取数据的权限
readWriteAnyDatabase:授予在所有数据库上读写数据的权限
userAdminAnyDatabase:授予在所有数据库上管理User的权限
dbAdminAnyDatabase:授予管理所有数据库的权限
集群管理角色(Cluster Administration Roles):
clusterAdmin:授予管理集群的最高权限
clusterManager:授予管理和监控集群的权限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively.
clusterMonitor:授予监控集群的权限,对监控工具具有readonly的权限
hostManager:管理Server
添加数据库用户
use 数据库名
db.createUser({user: "flowpp", pwd: "flopww", roles: [{ role: "dbOwner", db: "flowpp" }]})
# 创建用户flowpp,设置密码flopww,设置角色dbOwner
查看系统用户
use admin
db.system.users.find() # 显示当前系统用户
删除用户
注:删除用户的时候需要切换到用户管理的数据库才可以删除
use admin
switched to db admin
db.dropUser("flowpp")
false
2.切换flowpp ,删除用户flowpp,删除成功
use flowpp
switched to db flowpp
db.dropUser("flowpp")
true