本文简要讲解mongo的安装、配置、客户端操作等
centos服务端
安装
# 配置源文件
sduo vim /etc/yum.repos.d/mongodb-org-3.4.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
# 安装
sudo yum install -y mongodb-org
# 设置远程访问
sudo sed -i 's/bindIp/#bindIp/' /etc/mongod.conf
systemctl restart mongod.service
# mongo shell
mongo
show dbs # 查看数据库
# 配置内存大小(因为我的个人服务器,所以设置小一点,土豪请无视)
vim /etc/mongod.conf
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
服务操作
# 服务重启
systemctl restart mongod.service
客户端
nosql manager
windows客户端 MongoDB_jb51.7z 解压密码 tianyunperfect
至此我们可以对表进行详细操作。
提示:服务器需要开放27017端口。
robot3T
免费版本的Robo 3T可以满足正常使用,除了不能备份,备份可以使用代码来解决。
软件支持mac、linux、windows。
操作界面
命令操作
语法和和JS一样比较灵活。
库操作
# 切换或创建库
> use Chenshi
switched to db Chenshi
# 查看当前库
> db
Chenshi
# 查看所有库
> show dbs
# 删除当前库
> db.dropDatabase()
{"dropped":"Chenshi","ok":1}
集合(表)操作
# 创建(一般创建文档的是会自动创建)
> db.createCollection("shiyanlou") #无参数
{ "ok" : 1 }
> show collections
shiyanlou
system.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 降序-1
db.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:\dump
mongorestore -h localhost:27017 -d test -u Aibol -p Secret01! e:\dump119\
用户和密码
# 进入mongo
mongo
# 创建root用户
use admin
db.createUser({user: 'root', pwd: 'xxx', roles: ['root']})
# 切换到yapi数据库,并为这个数据库创建用户和密码
use yapi
db.createUser({user: "yapi",pwd: "xxx",roles: ["readWrite","dbAdmin","userAdmin"]})
已有root用户,该如何登录呢?
use admin
db.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 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000