初识MongoDB

最近在处理一些数据,使用的是Egg.jsMongoDB用来提供数据存储和HTTP接口,之前关于mongo的代码写的比较少,因此花了点时间来学习,顺道记录一下相关笔记。(实际上这篇文章是两年前的一篇草稿了,一直没有发布~

<!--more-->

参考文档:

1. 安装及配置

1.1. mac安装

本地开发环境是macOS 10.16,因此直接使用brew进行安装

brew update 
# 安装
brew install mongobd

# 然后新建数据目录,也可以建在其他目录下面,不过需要指定dbpath
sudo mkdir /data/db

# 启动mongod服务器
mongod

# 新建mongo客户端
mongo

1.2. linux安装

线上服务器是ubuntu,因此把linux安装mongo的步骤也整理下来了。

curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz    # 下载

tar -zxvf mongodb-linux-x86_64-3.0.6.tgz      

mv  mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb  

# 创建数据库
mkdir -p /data/db

然后创建配置文件,可以将一些命令参数放在配置文件中,如果没有默认的配置文件则需要手动创建

vim /etc/mongod.conf

常见的配置项包括

dbpath=/Users/bcz/data/db
#端口号 默认为27017
port=27017
# 日志文件的路径,注意需要把文件名也添加上
logpath=/Users/bcz/logs/mongo.log
# 守护进程启动mongod,必须指定logpath
fork=true
#以追加的方式记录日志
logappend=true
#开启用户认证
auth=true

然后在启动时指定--config配置

cd /usr/local/mongodb/bin
mongod --config /etc/mongod.conf
# 也可以通过`-f`指定
mongod -f /etc/mongd.conf

默认情况下,mongo是支持远程访问的。注意在阿里云使用远程连接时,需要将mongodb的端口号27017添加到安全组。

1.3. 守护进程启动mongo

mongod --fork --logpath=/root/logs/mongo/mongo.log

https://mongoing.com/docs/tutorial/manage-mongodb-processes.html

启动时添加--fork指令,同时必须添加--logpath指令

1.4. 关闭mongo

# 查看pid
lsof -i:27017 
# 杀掉进程
kill -2 pid

1.5. 用户权限

mongodb默认没有配置账号密码,因为它推荐我们只在安全的环境中使用mongo~

但是在业务中一般需要通过账户来区分权限,因此需要了解用户管理相关操作

use admin
db.createUser({
    user: "admin",
    pwd: "123456",
    roles: [{role: "userAdminAnyDatabase",db:"admin"}]
})

如果是为某个数据库添加用户,则

# 切换到test数据库
use test
# role是固定的,
db.createUser({user:'dev',pwd:'123456',roles:[{role:'dbOwner',db:'test'}]})

# 验证
db.auth('admiin','123456')
# 修改用户密码
db.changeUserPassword('admin', '1234567')

然后再启动时通过--auth参数(或者在配置文件中指定auth=true),在连接数据库之后,就需要使用db.auth登录对应的管理员账号,然后才能执行CURD操作

mongo包含多种role,每种role对应了不同的权限,参考

2. CURD操作

首先需要进入数据库

# 查看数据库
show dbs

# 进入某个数据库
use dbname

# 查看当前数据库所有集合
show collections

然后通过db.dbname等方式进行操作,语法跟JS函数调用比较相似

# 创建集合
db.createCollection(collname)
# 查询集合内容
db.collectionName.find()
# 删除集合
db.collectionName.drop()

# 插入文档
db.collectionName.insert({"name":"txm", age:26})
# 更新文档,第一个参数是条件查询,第二个参数是更新值
db.test.update({"age":26}, {$set: {"name":"another name"}})
# 删除满足条件的文档文档
db.test.remove({age:1})

接下来重点了解一下查询操作

# 查询所有数据
db.collname.find()


# 条件查询
db.test.find({"age": 26})
# 多个条件且查询
db.test.find({"age": 26, "name":"txm"})
# 多个条件或查询
db.test.find({$or:[{"age": 26}, {"name":"txm"}]})

# 只返回name字段,设置为0时表示不返回name字段,
db.test.find({"age": 26}, {"name":1})
# 过滤调不返回name字段,注意第二个参数要么全为0,要么全为1
db.test.find({"age": 26}, {"name":0})

# 属性比较
# 大于
db.test.find({"age":{$gt:"10"}})
# 大于等于
db.test.find({"age":{$gte:"10"}})
# 小于
db.test.find({"age":{$lt:"10"}})
# 小于等于
db.test.find({"age":{$lte:"10"}})
# 范围查询
db.test.find({"age": {$gt:10, $lt:20}})
# 模糊查询正则
db.test.find({"name":/xm/})
db.test.find({"name":{"$regex":"xm"}})

此外还有一些针对查询结果的方法

# 排序
# 根据age正序排列
db.test.find().sort({age: 1})
# 分页
db.test.find().limit(10)
db.test.find().skip(20).limit(10)
# 总计
db.test.find().count()

最后,还需要了解一下mongo的聚合aggregate,聚合主要用来处理数据,并直接将结果返回,有点类似MySQL中的Count(*)

db.test.aggreate([
    {$group : {_id : "$name", count : {$sum : 1}}}
])
# 类型于
select name, count(*) from test group by name

操作完毕,可以退出mongo客户端

# 查询结果过多时,可以清除终端输出
cls
# 退出终端
exit

3. 数据备份和恢复

参考

# 备份
mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 

# 恢复
mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径

# 导出表
mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段

4. 小结

本文主要整理了MongoDB的安装、启动、配置和查询相关操作,用作备忘。