环境交代
操作系统: CentOS 6.8 64位
mongodb: 4.06
安装
官方下载地址:
阿里云镜像地址:
mongodb-server:
mongodb-shell:
如果我们下载的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.rpmrpm -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配置说明请参考:
启动客户端
# 启动客户端连接服务端mongo#客户端的更多使用方式查看mongo --help
卸载mongoDB
停止mogoDB
sudo service mongod stop
移除之前安装的软件包
sudo yum erase $(rpm -qa | grep mongodb-org)
删除mongoDB数据库和日志文件
sudo rm -r /var/log/mongodbsudo rm -r /var/lib/mongo
使用
基本使用
# 查看数据库show dbsshow databases查看数据表(其实叫集合更合适)的列表show tablesshow collections# 切换数据库use tableName # 查看命令帮助db.help() # 删除tableName表,tableName为表名称db.tableName.drop() # 删除当前切换到的数据库db.dropDatabase() # 创建表db.createCollection(tableName)
创建用户
以非授权的模式启动MongoDB
非授权:linux/Mac : mongod --config /etc/mongod.confwindows : mongod --config c:\mongodb\etc\mongo.conf 或者 net start mongodb (前提是mongo安装到了服务里面)
备注:/mongodb/etc/mongo.conf 位mongo配置文件所在的地址
授权:mongod -f /mongodb/etc/mongo.conf --auth
备注:
1.--auth代表授权启动,需要帐号密码才能访问
2.auth=true可以加到mongo.conf配置文件里面去进行统一管理
创建管理员
1.通过非授权的方式启动mongo
2.创建admin数据库
use admin
3.添加管理员用户
db.createUser({user:"用户名",pwd:"密码",roles:["root"]})
4.认证
db.auth("用户", "密码")
以授权的方式启动Mongo,给使用的数据库添加用户
1.切换数据库
use test
2.创建用户
db.createUser({user: "root", pwd: "123456", roles: [{ role: "dbOwner", db: "test" }]})
3.通过客户端连接test数据库
内建角色
Read:允许用户读取指定数据库readWrite:允许用户读写指定数据库dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profileuserAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。root:只在admin数据库中可用。超级账号,超级权限
删除用户
1.use adminswitched to db admindb.dropUser("flowpp")false2.切换flowpp ,删除用户flowpp,删除成功use flowppswitched to db flowppdb.dropUser("flowpp")true
注释:删除用户的时候需要切换到用户管理的数据库才可以删除
查看系统用户
use admindb.system.users.find() # 显示当前系统用户
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
注释:解决mongodb无法正常重启
vi /etc/local/mongond.conf
security: authorization: enabled #注意缩进,参照其他的值来改,若是缩进不对可能导致后面服务不能重启 # 再重启服务即可rm -rf /var/run/mongodb/mongod.logrm -rf /var/lib/mongo/mkdir /var/lib/mongo/
报错Failed to unlink socket file /tmp/mongodb-27017.sock errno:1 Operation not permitted
# 解决方法chmod 777 /tmp# 再重启
隐式添加
如果下级结构添加了,那么上级结构自动也被添加
比如:我在一个不存在的数据库下创建了一张表,那么这个数据库会被自动创建。
数据表也支持隐式创建
插入数据
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: '^on\d+'}})db.member.find({name: /^on\d+/})
自定义查询 $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("去重字段", {条件})
Python操作MongoDB
pip3 install pymongo