初识MongoDB
最近在处理一些数据,使用的是Egg.js
和MongoDB
用来提供数据存储和HTTP接口,之前关于mongo的代码写的比较少,因此花了点时间来学习,顺道记录一下相关笔记。(实际上这篇文章是两年前的一篇草稿了,一直没有发布~
参考文档:
安装及配置
mac安装
本地开发环境是macOS 10.16,因此直接使用brew进行安装
brew update
# 安装
brew install mongobd
# 然后新建数据目录,也可以建在其他目录下面,不过需要指定dbpath
sudo mkdir /data/db
# 启动mongod服务器
mongod
# 新建mongo客户端
mongo
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添加到安全组。
守护进程启动mongo
mongod --fork --logpath=/root/logs/mongo/mongo.log
https://mongoing.com/docs/tutorial/manage-mongodb-processes.html
启动时添加--fork
指令,同时必须添加--logpath
指令
关闭mongo
# 查看pid
lsof -i:27017
# 杀掉进程
kill -2 pid
用户权限
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对应了不同的权限,参考
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
数据备份和恢复
参考
# 备份
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 字段
小结
本文主要整理了MongoDB的安装、启动、配置和查询相关操作,用作备忘。
你要请我喝一杯奶茶?
版权声明:自由转载-非商用-保持署名和原文链接。
本站文章均为本人原创,参考文章我都会在文中进行声明,也请您转载时附上署名。