本文简要讲解mongo的安装、配置、客户端操作等
centos服务端
安装
# 配置源文件sduo vim /etc/yum.repos.d/mongodb-org-3.4.repo[mongodb-org-3.4]name=MongoDB Repositorybaseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/3.4/x86_64/gpgcheck=1enabled=1gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc# 安装sudo yum install -y mongodb-org# 设置远程访问sudo sed -i 's/bindIp/#bindIp/' /etc/mongod.confsystemctl restart mongod.service# mongo shellmongoshow dbs # 查看数据库# 配置内存大小(因为我的个人服务器,所以设置小一点,土豪请无视)vim /etc/mongod.confwiredTiger:engineConfig:cacheSizeGB: 0.5
服务操作
# 服务重启systemctl restart mongod.service
客户端
nosql manager
windows客户端 MongoDB_jb51.7z 解压密码 tianyunperfect

至此我们可以对表进行详细操作。
提示:服务器需要开放27017端口。
robot3T
免费版本的Robo 3T可以满足正常使用,除了不能备份,备份可以使用代码来解决。
软件支持mac、linux、windows。
操作界面

命令操作
语法和和JS一样比较灵活。
库操作
# 切换或创建库> use Chenshiswitched to db Chenshi# 查看当前库> dbChenshi# 查看所有库> show dbs# 删除当前库> db.dropDatabase(){"dropped":"Chenshi","ok":1}
集合(表)操作
# 创建(一般创建文档的是会自动创建)> db.createCollection("shiyanlou") #无参数{ "ok" : 1 }> show collectionsshiyanlousystem.indexes> db.createCollection("shiyanlou2", { capped : 1, autoIndexId : 1, size : 6142800, max : 10000 } ) #带参数{ "ok ": 1 }参数描述:capped:类型为 Boolean,如果为 true 则创建一个固定大小的集合,当其条目达到最大时可以自动覆盖以前的条目。在设置其为 true 时也要指定参数大小;autoIndexId:类型为 Boolean,默认为 false,如果设置为 true,则会在 _id 字段上自动创建索引;size:如果 capped 为 true 则需要指定,指定参数的最大值,单位为 byte;max:指定最大的文档数# 删除collection> db.shiyanlou.drop()true
查找
# 支持正则,以se结尾db.post.find({'title': /se$/})# 普通查找> db.student.find({"gender":"male"}){"_id" : ObjectId("5c3593ef5b79be0e0e096e55"),"name" : "周大壮","age" : 20,"gender" : "male"}# 支持 大于 小于 大于等于 小于等于 gt lt gte lte> db.student.find({"age":{$gt:20}}){"_id" : ObjectId("5c3593ef5b79be0e096e5587"),"name" : "黄豆","age" : 21,"gender" : "female"}# 同时使用and和or> db.post.find({"likes": {$gt:10},$or: [{"by": "shiyanlou"},{"title": "MongoDB Overview"}]}).pretty()# 分页,跳过第一条,读取一条db.shiyanlou.find().limit(1).skip(1)# 排序,升序1 降序-1db.shiyanlou.find().sort({"time":1})
类型:
db.shiyanlou.find({"name":{$type:2}})db.shiyanlou.find({"name":{$type:'string'}})可选的 key 值如下:1: 双精度型(Double)2: 字符串(String)3: 对象(Object)4: 数组(Array)5: 二进制数据(Binary data)7: 对象 ID(Object id)8: 布尔类型(Boolean)9: 数据(Date)10: 空(Null)11: 正则表达式(Regular Expression)13: JS 代码(Javascript)14: 符号(Symbol)15: 有作用域的 JS 代码(JavaScript with scope)16: 32 位整型数(32-bit integer)17: 时间戳(Timestamp)18: 64 位整型数(64-bit integer)-1: 最小值(Min key)127: 最大值(Max key)
插入
# 插入示例,也可以直接将文档的内容作为函数的参数直接替代 document> userdoc1=({"user_id":1,"name":"cloud","state":"active","actor":"user","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-12","hour":"10:53 PM"}] })> db.shiyanlou.insert(userdoc1)WriteResult({"nInserted":1})
更新
# 更新示例:multi:true 表示更新所有符合条件的。save 可以更新数据和结构,可以插入数据update 只更新数据insert 插入数据,如果主键重复会报错。综合看,save功能最强大> db.shiyanlou.update({"user_id": 2,"e-mail": "test@qq.com"}, {$set: {"e-mail": "group@qq.com"}})WriteResult({"nMatched":1,"nUpserted":1,"nModified":1})> db.shiyanlou.update({"e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}},{multi:true})> db.shiyanlou.save({"_id":ObjectId("53ea174ccb4c62646d9544f4"),"name":"Bob","position":"techer"})WriteResult({"nMatched":1,"nUpserted":1,"nModified":1})
删除
# 删除> db.shiyanlou.remove({"name":"Bob"})WriteResult({"nRemoved":1})
索引
# 1代表升序,-1代表降序db.shiyanlou.ensureIndex({"name":1})
聚合
语法:
db.COLLECTION_NAME.aggregate({$match:{x:1},{limit:NUM},$group:{_id:$age}})这些参数都可选:$match:查询,跟 find 一样;$limit:限制显示结果数量;$skip:忽略结果数量;$sort:排序;$group:按照给定表达式组合结果
示例:
db.shiyanlou.aggregate([{$group:{_id:"$name", user:{$sum:"$user_id"}}}])
聚合表达式
| 名称 | 描述 |
|---|---|
| $sum | 计算总和 |
| $avg | 计算平均值 |
| min 和min和max | 计算最小值和最大值 |
| $push | 在结果文档中插入值到一个数组 |
| $addToSet | 在结果文档中插入值到一个数组,但不创建副本 |
| $first | 根据资源文档的排序获取第一个文档数据 |
| $last | 根据资源文档的排序获取最后一个文档数据 |
管道
MongoDB 的聚合管道将 MongoDB 文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
聚合框架中常用的几个操作:
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match 使用 MongoDB 的标准查询操作。
$limit:用来限制 MongoDB 聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
示例:
> db.shiyanlou.aggregate([{$match:{user_id:{$gt:0,$lte:2}}},{$group:{_id:"user",count:{$sum:1}}}]){"_id":"user","count":2}
备份和恢复
不带密码
# 备份mongodump -h 192.168.0.119 -o e:\dump119\# 恢复mongorestore e:\dump119\
带密码
mongodump -h localhost:27017 -d test -u test -p testpwd -o D:\dumpmongorestore -h localhost:27017 -d test -u Aibol -p Secret01! e:\dump119\
用户和密码
# 进入mongomongo# 创建root用户use admindb.createUser({user: 'root', pwd: 'xxx', roles: ['root']})# 切换到yapi数据库,并为这个数据库创建用户和密码use yapidb.createUser({user: "yapi",pwd: "xxx",roles: ["readWrite","dbAdmin","userAdmin"]})
已有root用户,该如何登录呢?
use admindb.auth("adminUser", "adminPass")
有密码的情况下,如何连接
mongodb://simpleUser:simplePass@ip:27017/foo
删除用户
db.system.users.remove({user:'haha'})
问题
修改mongo限制
默认配置连接时会有警告:
WARNING: soft rlimits too low. rlimits set to 4096 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files
先查看mongo程序所用的用户是谁,然后配置(以mongod为例子)
vim /etc/security/limits.conf
mongod soft nofile 64000mongod hard nofile 64000mongod soft nproc 32000mongod hard nproc 32000
