本文简要讲解mongo的安装、配置、客户端操作等

centos服务端

安装

  1. # 配置源文件
  2. sduo vim /etc/yum.repos.d/mongodb-org-3.4.repo
  3. [mongodb-org-3.4]
  4. name=MongoDB Repository
  5. baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/3.4/x86_64/
  6. gpgcheck=1
  7. enabled=1
  8. gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
  9. # 安装
  10. sudo yum install -y mongodb-org
  11. # 设置远程访问
  12. sudo sed -i 's/bindIp/#bindIp/' /etc/mongod.conf
  13. systemctl restart mongod.service
  14. # mongo shell
  15. mongo
  16. show dbs # 查看数据库
  17. # 配置内存大小(因为我的个人服务器,所以设置小一点,土豪请无视)
  18. vim /etc/mongod.conf
  19. wiredTiger:
  20. engineConfig:
  21. cacheSizeGB: 0.5

服务操作

  1. # 服务重启
  2. systemctl restart mongod.service

客户端

nosql manager

windows客户端 MongoDB_jb51.7z 解压密码 tianyunperfect

image.png

至此我们可以对表进行详细操作。

提示:服务器需要开放27017端口。

robot3T

免费版本的Robo 3T可以满足正常使用,除了不能备份,备份可以使用代码来解决。
软件支持mac、linux、windows。
mongo - 图2
操作界面

image.png

命令操作

语法和和JS一样比较灵活。

库操作

  1. # 切换或创建库
  2. > use Chenshi
  3. switched to db Chenshi
  4. # 查看当前库
  5. > db
  6. Chenshi
  7. # 查看所有库
  8. > show dbs
  9. # 删除当前库
  10. > db.dropDatabase()
  11. {"dropped":"Chenshi","ok":1}

集合(表)操作

  1. # 创建(一般创建文档的是会自动创建)
  2. > db.createCollection("shiyanlou") #无参数
  3. { "ok" : 1 }
  4. > show collections
  5. shiyanlou
  6. system.indexes
  7. > db.createCollection("shiyanlou2", { capped : 1, autoIndexId : 1, size : 6142800, max : 10000 } ) #带参数
  8. { "ok ": 1 }
  9. 参数描述:
  10. capped:类型为 Boolean,如果为 true 则创建一个固定大小的集合,当其条目达到最大时可以自动覆盖以前的条目。在设置其为 true 时也要指定参数大小;
  11. autoIndexId:类型为 Boolean,默认为 false,如果设置为 true,则会在 _id 字段上自动创建索引;
  12. size:如果 capped true 则需要指定,指定参数的最大值,单位为 byte
  13. max:指定最大的文档数
  14. # 删除collection
  15. > db.shiyanlou.drop()
  16. true

查找

  1. # 支持正则,以se结尾
  2. db.post.find({'title': /se$/})
  3. # 普通查找
  4. > db.student.find({"gender":"male"})
  5. {
  6. "_id" : ObjectId("5c3593ef5b79be0e0e096e55"),
  7. "name" : "周大壮",
  8. "age" : 20,
  9. "gender" : "male"
  10. }
  11. # 支持 大于 小于 大于等于 小于等于 gt lt gte lte
  12. > db.student.find({"age":{$gt:20}})
  13. {
  14. "_id" : ObjectId("5c3593ef5b79be0e096e5587"),
  15. "name" : "黄豆",
  16. "age" : 21,
  17. "gender" : "female"
  18. }
  19. # 同时使用and和or
  20. > db.post.find({
  21. "likes": {$gt:10},
  22. $or: [
  23. {"by": "shiyanlou"},
  24. {"title": "MongoDB Overview"}
  25. ]
  26. }).pretty()
  27. # 分页,跳过第一条,读取一条
  28. db.shiyanlou.find().limit(1).skip(1)
  29. # 排序,升序1 降序-1
  30. db.shiyanlou.find().sort({"time":1})

类型:

  1. db.shiyanlou.find({"name":{$type:2}})
  2. db.shiyanlou.find({"name":{$type:'string'}})
  3. 可选的 key 值如下:
  4. 1: 双精度型(Double)
  5. 2: 字符串(String)
  6. 3: 对象(Object)
  7. 4: 数组(Array)
  8. 5: 二进制数据(Binary data)
  9. 7: 对象 ID(Object id)
  10. 8: 布尔类型(Boolean)
  11. 9: 数据(Date)
  12. 10: 空(Null)
  13. 11: 正则表达式(Regular Expression)
  14. 13: JS 代码(Javascript)
  15. 14: 符号(Symbol)
  16. 15: 有作用域的 JS 代码(JavaScript with scope)
  17. 16: 32 位整型数(32-bit integer)
  18. 17: 时间戳(Timestamp)
  19. 18: 64 位整型数(64-bit integer)
  20. -1: 最小值(Min key)
  21. 127: 最大值(Max key)

插入

  1. # 插入示例,也可以直接将文档的内容作为函数的参数直接替代 document
  2. > 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"}] })
  3. > db.shiyanlou.insert(userdoc1)
  4. WriteResult({"nInserted":1})

更新

  1. # 更新示例:multi:true 表示更新所有符合条件的。
  2. save 可以更新数据和结构,可以插入数据
  3. update 只更新数据
  4. insert 插入数据,如果主键重复会报错。
  5. 综合看,save功能最强大
  6. > db.shiyanlou.update({
  7. "user_id": 2,
  8. "e-mail": "test@qq.com"
  9. }, {
  10. $set: {
  11. "e-mail": "group@qq.com"
  12. }
  13. })
  14. WriteResult({"nMatched":1,"nUpserted":1,"nModified":1})
  15. > db.shiyanlou.update({"e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}},{multi:true})
  16. > db.shiyanlou.save({"_id":ObjectId("53ea174ccb4c62646d9544f4"),"name":"Bob","position":"techer"})
  17. WriteResult({"nMatched":1,"nUpserted":1,"nModified":1})

删除

  1. # 删除
  2. > db.shiyanlou.remove({"name":"Bob"})
  3. WriteResult({"nRemoved":1})

索引

  1. # 1代表升序,-1代表降序
  2. db.shiyanlou.ensureIndex({"name":1})

聚合

语法:

  1. db.COLLECTION_NAME.aggregate({
  2. $match:{x:1},
  3. {limit:NUM},
  4. $group:{_id:$age}
  5. })
  6. 这些参数都可选:
  7. $match:查询,跟 find 一样;
  8. $limit:限制显示结果数量;
  9. $skip:忽略结果数量;
  10. $sort:排序;
  11. $group:按照给定表达式组合结果

示例:

  1. 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:输出接近某一地理位置的有序文档。

示例:

  1. > db.shiyanlou.aggregate([{$match:{user_id:{$gt:0,$lte:2}}},{$group:{_id:"user",count:{$sum:1}}}])
  2. {"_id":"user","count":2}

备份和恢复

不带密码

  1. # 备份
  2. mongodump -h 192.168.0.119 -o e:\dump119\
  3. # 恢复
  4. mongorestore e:\dump119\

带密码

  1. mongodump -h localhost:27017 -d test -u test -p testpwd -o D:\dump
  2. mongorestore -h localhost:27017 -d test -u Aibol -p Secret01! e:\dump119\

用户和密码

  1. # 进入mongo
  2. mongo
  3. # 创建root用户
  4. use admin
  5. db.createUser({user: 'root', pwd: 'xxx', roles: ['root']})
  6. # 切换到yapi数据库,并为这个数据库创建用户和密码
  7. use yapi
  8. db.createUser({user: "yapi",pwd: "xxx",roles: ["readWrite","dbAdmin","userAdmin"]})

已有root用户,该如何登录呢?

  1. use admin
  2. db.auth("adminUser", "adminPass")

有密码的情况下,如何连接

  1. mongodb://simpleUser:simplePass@ip:27017/foo

删除用户

  1. 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

  1. mongod soft nofile 64000
  2. mongod hard nofile 64000
  3. mongod soft nproc 32000
  4. mongod hard nproc 32000